@koda-sl/baker-cli 0.455.0 → 0.456.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -17
- package/dist/{account-2OBWFPRG.js → account-AO6PNNPO.js} +6 -6
- package/dist/account-reads-W3XO7CIW.js +218 -0
- package/dist/account-reads-W3XO7CIW.js.map +1 -0
- package/dist/{accounts-TDTME6RQ.js → accounts-4TM4UZEJ.js} +5 -5
- package/dist/{accounts-TZQVAJ3V.js → accounts-XDC26KK6.js} +7 -7
- package/dist/{actions-FHYESJEE.js → actions-CJB4GZYA.js} +18 -18
- package/dist/{add-Q6YFHEOR.js → add-BP4CUUKB.js} +4 -4
- package/dist/{add-7XB5X3D3.js → add-RYR3QGOP.js} +5 -5
- package/dist/{ads-PGTFZA5Q.js → ads-GII5LEOH.js} +6 -6
- package/dist/{ads-6UEDYT3O.js → ads-SATXH4OD.js} +9 -9
- package/dist/{adsets-Q5DWGANV.js → adsets-PMXNW3EG.js} +8 -8
- package/dist/{advertisers-RKWQDCOI.js → advertisers-GM5UFI44.js} +7 -7
- package/dist/{analytics-DEJKJNLN.js → analytics-4CD7CH7H.js} +5 -5
- package/dist/{analytics-U5TTTX7K.js → analytics-JDPRLCHQ.js} +15 -15
- package/dist/{assign-RHUKQWH2.js → assign-XI4HIIIM.js} +5 -5
- package/dist/{audience-size-ICEKQRE4.js → audience-size-DHZ65PGA.js} +5 -5
- package/dist/{audiences-AMRFZRZ7.js → audiences-D7CXP3ZF.js} +3 -3
- package/dist/{audit-GWLQVB4A.js → audit-M7BZYBIS.js} +5 -5
- package/dist/{autocomplete-NAEVFMKZ.js → autocomplete-B45I26R4.js} +7 -7
- package/dist/{avatars-PMV6IMFV.js → avatars-75BALNB7.js} +4 -4
- package/dist/{bid-pricing-XF3LD65L.js → bid-pricing-4RCP24BE.js} +5 -5
- package/dist/{brand-ZC5HDP7B.js → brand-2TOLKYDY.js} +2 -2
- package/dist/{brief-3EZ2JS5F.js → brief-5G4NEZ4O.js} +16 -16
- package/dist/{campaign-groups-JSHBFYDG.js → campaign-groups-G7B26V7K.js} +10 -10
- package/dist/{campaign-writes-5PHXENPN.js → campaign-writes-HZ7ART7W.js} +5 -5
- package/dist/{campaigns-D6B6Z67Y.js → campaigns-MEEM3CNC.js} +8 -8
- package/dist/{campaigns-HPRQVXTH.js → campaigns-OIJGTO7W.js} +5 -5
- package/dist/{campaigns-LQXELRHZ.js → campaigns-RW3QJQ2F.js} +13 -13
- package/dist/{canvas-4NVEZNW5.js → canvas-LXRLDE5G.js} +12 -12
- package/dist/{capabilities-VQRNPBOZ.js → capabilities-BWSB7IFT.js} +5 -5
- package/dist/{changes-TP7ZZHB3.js → changes-AYLNY6KN.js} +5 -5
- package/dist/{chatgpt-QNUN63YS.js → chatgpt-TNSRA3L3.js} +1 -1
- package/dist/{chats-Q4QPA3OQ.js → chats-MMHBJQFM.js} +5 -5
- package/dist/{chunk-RXGR63TP.js → chunk-24GELJP3.js} +2 -2
- package/dist/{chunk-ZKYNGME7.js → chunk-2D4ASTGN.js} +3 -3
- package/dist/{chunk-PRIHMSJH.js → chunk-2K4LMCV2.js} +2 -2
- package/dist/{chunk-4GACYQUI.js → chunk-2YJL6MEB.js} +3 -3
- package/dist/{chunk-L27H2R2N.js → chunk-2ZY7HON7.js} +2 -2
- package/dist/{chunk-RZTNH2TX.js → chunk-45OQOUJA.js} +2 -2
- package/dist/{chunk-LLOOWRBB.js → chunk-4KCKNAVW.js} +189 -20
- package/dist/chunk-4KCKNAVW.js.map +1 -0
- package/dist/{chunk-GX6VAHY7.js → chunk-5FWMRTNB.js} +31 -15
- package/dist/chunk-5FWMRTNB.js.map +1 -0
- package/dist/{chunk-YT2BSTD3.js → chunk-7TNPEURJ.js} +2 -2
- package/dist/chunk-7VHPAGPK.js +228 -0
- package/dist/chunk-7VHPAGPK.js.map +1 -0
- package/dist/{chunk-WKS6ZDUP.js → chunk-BSOWFWEU.js} +7 -7
- package/dist/{chunk-X5ECCSHP.js → chunk-D23EKXOP.js} +2 -2
- package/dist/{chunk-FC3U5XKS.js → chunk-D7PFF6UC.js} +4 -4
- package/dist/{chunk-OU5YA2QX.js → chunk-DT2XXF6O.js} +2 -2
- package/dist/{chunk-ARBKEE6E.js → chunk-DYOI4FQ7.js} +2 -2
- package/dist/{chunk-4EVLVA2R.js → chunk-EFM7OODQ.js} +2 -2
- package/dist/{chunk-P6KWFODZ.js → chunk-EIIANSBX.js} +2 -2
- package/dist/{chunk-HJMRWBR5.js → chunk-EYK6G4XE.js} +2 -2
- package/dist/{chunk-PKC6QBYJ.js → chunk-EZWYX343.js} +4 -4
- package/dist/{chunk-LIQ4SQ2T.js → chunk-FEELV5IV.js} +2 -2
- package/dist/{chunk-YCWIGXH6.js → chunk-GP7QUF5A.js} +2 -2
- package/dist/{chunk-ZGGGA3JR.js → chunk-HOXZOOVA.js} +8 -8
- package/dist/{chunk-CYEO5ZIO.js → chunk-JPK34QPS.js} +3 -2
- package/dist/{chunk-CYEO5ZIO.js.map → chunk-JPK34QPS.js.map} +1 -1
- package/dist/{chunk-TJOGO2MK.js → chunk-JU7FIHQ2.js} +2 -2
- package/dist/{chunk-MVYLY2SF.js → chunk-KN7DFVKW.js} +2 -2
- package/dist/{chunk-K5H3XOYQ.js → chunk-LI6PGY3L.js} +2 -2
- package/dist/{chunk-3KEWXALS.js → chunk-MCWYIEWI.js} +3 -3
- package/dist/{chunk-LIWBVGRE.js → chunk-MFQ5SUJT.js} +3 -3
- package/dist/{credentials-4V55RYZ6.js → chunk-ML7DLFFY.js} +3421 -249
- package/dist/chunk-ML7DLFFY.js.map +1 -0
- package/dist/{chunk-HEOWTR7Z.js → chunk-OW4XDJV2.js} +2 -2
- package/dist/{chunk-KYR4EG3E.js → chunk-PHEEJUFL.js} +2 -2
- package/dist/chunk-QM6T4BFA.js +76 -0
- package/dist/chunk-QM6T4BFA.js.map +1 -0
- package/dist/{chunk-KHV5GALI.js → chunk-QNDLOCAI.js} +2 -2
- package/dist/{chunk-GQ7JE7A7.js → chunk-UZUHXN7H.js} +2 -2
- package/dist/{chunk-YWK4UBVU.js → chunk-V5QJBDBC.js} +2 -2
- package/dist/{chunk-LP2QDRO4.js → chunk-WBUMUELD.js} +7 -7
- package/dist/{chunk-EP5TYLNV.js → chunk-WEU6GKUQ.js} +3 -3
- package/dist/{chunk-46TPPYCI.js → chunk-X5VHGXFB.js} +2 -2
- package/dist/{chunk-3V57D7GE.js → chunk-XJRBFLBD.js} +2 -2
- package/dist/{query-IEZRY6HV.js → chunk-XPOIIQCI.js} +406 -148
- package/dist/chunk-XPOIIQCI.js.map +1 -0
- package/dist/{chunk-ZJWUBJYQ.js → chunk-XQIOCIDO.js} +1 -1
- package/dist/chunk-XQIOCIDO.js.map +1 -0
- package/dist/{chunk-T4DD5YMP.js → chunk-XY7BZSDQ.js} +12 -12
- package/dist/{chunk-T4DD5YMP.js.map → chunk-XY7BZSDQ.js.map} +1 -1
- package/dist/{chunk-QS2BDKFL.js → chunk-Y63Y4QSY.js} +2 -2
- package/dist/{chunk-PAQ3T6OT.js → chunk-YRVDCIJ2.js} +2 -2
- package/dist/{claim-RHZVTMQZ.js → claim-UDNXCJIU.js} +5 -5
- package/dist/cli.js +29 -29
- package/dist/{companies-LIKSVYSR.js → companies-RPZN4JTR.js} +5 -5
- package/dist/{complete-OM7R6VOC.js → complete-HLSRQE3N.js} +5 -5
- package/dist/{connect-AVX3NKP6.js → connect-TIJZO7OV.js} +8 -8
- package/dist/{conversation-3HGRWXKO.js → conversation-BS7TF6LZ.js} +5 -5
- package/dist/{conversion-upload-command-AUF3LNTH.js → conversion-upload-command-CSD344BY.js} +6 -6
- package/dist/{conversions-XADFSQ4W.js → conversions-FEWAX64H.js} +9 -9
- package/dist/{create-PQSDE4J3.js → create-4SH4BZXP.js} +5 -5
- package/dist/{create-BWHYYATN.js → create-B4UVIJZI.js} +4 -4
- package/dist/{create-Z4JLLTPG.js → create-F5FNHJKE.js} +5 -5
- package/dist/{create-3I64N6RJ.js → create-L3JHP6J4.js} +5 -5
- package/dist/{creatives-WPRN6CU4.js → creatives-LK2NZHRX.js} +10 -10
- package/dist/{creatives-UEPLNCPN.js → creatives-RQ2DFHGI.js} +3 -3
- package/dist/{creatives-6Z7CEW5O.js → creatives-UILBPOKO.js} +10 -10
- package/dist/credentials-GC34ZPYP.js +287 -0
- package/dist/credentials-GC34ZPYP.js.map +1 -0
- package/dist/{critique-M5TMIG2D.js → critique-FAOH4FCP.js} +7 -7
- package/dist/{critique-K632OHFP.js → critique-X7HYYEJ4.js} +5 -5
- package/dist/{crm-CWT6BMMX.js → crm-RB5TVV3M.js} +6 -6
- package/dist/{crm-Q2QK4ZMS.js → crm-XEQDSU2U.js} +6 -6
- package/dist/{currency-XCGKQ7FE.js → currency-47QHFHDA.js} +4 -4
- package/dist/{custom-conversions-2VLJGPRV.js → custom-conversions-7HOWR6X6.js} +2 -2
- package/dist/{customers-7TS64ZM5.js → customers-P5WOUY6G.js} +7 -7
- package/dist/{delete-H7W3V6QG.js → delete-DLQ2ZZDA.js} +4 -4
- package/dist/{delete-BPSOLCGB.js → delete-GZKGPBBD.js} +5 -5
- package/dist/{delete-RIY5VUTU.js → delete-SW5OSIGN.js} +5 -5
- package/dist/{demographics-NHGM4QP7.js → demographics-ZLZOIWUE.js} +5 -5
- package/dist/{discard-IBMOGEYB.js → discard-VNVNJWNX.js} +5 -5
- package/dist/{discover-BJPZNXUQ.js → discover-P6TUGZ45.js} +4 -4
- package/dist/{domain-Y3N2UY5I.js → domain-OBICRJP3.js} +5 -5
- package/dist/draft-666YKA3P.js +307 -0
- package/dist/draft-666YKA3P.js.map +1 -0
- package/dist/{draft-322ZG6JG.js → draft-UECMJ6B4.js} +5 -5
- package/dist/{draft-6KBILDJK.js → draft-V75RBORX.js} +5 -5
- package/dist/{draft-P5T2QHCY.js → draft-Z3VUQ4LJ.js} +7 -7
- package/dist/{facets-3SDK42HY.js → facets-7J66L3NK.js} +5 -5
- package/dist/{feedback-P2JZTJY5.js → feedback-3LDG4WVJ.js} +2 -2
- package/dist/{feedback-record-5O6UUWTZ.js → feedback-record-CTAUHLMF.js} +9 -9
- package/dist/{fetch-LN5W3J4E.js → fetch-4RXXZGO4.js} +5 -5
- package/dist/{flows-MN26KBWB.js → flows-GGB46DLH.js} +12 -12
- package/dist/{fonts-7TXPTNCS.js → fonts-S3GWKOUJ.js} +7 -7
- package/dist/{forecast-ZHBKYQFP.js → forecast-6JVKXNFB.js} +5 -5
- package/dist/forecast-SVD3LMMY.js +168 -0
- package/dist/forecast-SVD3LMMY.js.map +1 -0
- package/dist/{funnel-UAXVM7JN.js → funnel-RCQOIQZ5.js} +6 -6
- package/dist/{ga4-DV2AXCSL.js → ga4-U6DMJ6K4.js} +1 -1
- package/dist/{get-EKYSQHNB.js → get-KQSM2MXM.js} +5 -5
- package/dist/{get-P7SSZ46N.js → get-MN2GRXGZ.js} +5 -5
- package/dist/{google-M7KEXVK5.js → google-CI2AMJKN.js} +1518 -200
- package/dist/google-CI2AMJKN.js.map +1 -0
- package/dist/{google-ads-LZDXDFPW.js → google-ads-YAJ33LTW.js} +5 -5
- package/dist/{history-BFGVCJ4J.js → history-QWYLRQBO.js} +5 -5
- package/dist/{hubspot-I3PNNF3E.js → hubspot-DDONLJ7R.js} +9 -9
- package/dist/{ideas-ZNP5BOGE.js → ideas-N44Z2SIT.js} +4 -4
- package/dist/{images-MWWGN672.js → images-BKHCBCE7.js} +4 -4
- package/dist/{ingest-H7BWHY7L.js → ingest-HBECWLOB.js} +4 -4
- package/dist/{ingest-NYP2ZAAK.js → ingest-VNRTFD4Y.js} +5 -5
- package/dist/{inspect-FNNDBZQX.js → inspect-7GGJDJBJ.js} +5 -5
- package/dist/{inspiration-S3DU4CMQ.js → inspiration-CGM3NK6X.js} +1 -1
- package/dist/{intent-E3UIVZBN.js → intent-HKNBXEDS.js} +4 -4
- package/dist/{keyword-gap-BG6M665A.js → keyword-gap-HUSP6MOT.js} +4 -4
- package/dist/{keyword-metrics-WG5LLBUW.js → keyword-metrics-2C3VFGDQ.js} +7 -7
- package/dist/{keywords-for-site-HVEAAODA.js → keywords-for-site-4GV4KS4X.js} +7 -7
- package/dist/{landing-G5MLO4CZ.js → landing-V2FMPQOK.js} +3 -3
- package/dist/{languages-HORKPDNH.js → languages-75YJZAHL.js} +4 -4
- package/dist/{leads-XCAE4OVV.js → leads-DTULNGMU.js} +5 -5
- package/dist/{leads-ARUWPHBM.js → leads-OPRVJBQG.js} +4 -4
- package/dist/{learn-5WSN4PT5.js → learn-EW2CKOFS.js} +9 -9
- package/dist/{line-item-writes-4EOQBQSC.js → line-item-writes-EF3BJ5KV.js} +5 -5
- package/dist/{line-items-45X5BVQW.js → line-items-G467XOZF.js} +5 -5
- package/dist/{link-XAXNBIKU.js → link-5SU4MR6M.js} +5 -5
- package/dist/{linkedin-62HOT3HB.js → linkedin-OFM3VVOB.js} +29 -29
- package/dist/{list-PLWORN75.js → list-HEWXAVCL.js} +4 -4
- package/dist/{list-NYTQ3DBH.js → list-SUTCQLGI.js} +5 -5
- package/dist/{list-H4SN4QYE.js → list-VFZPXFMA.js} +5 -5
- package/dist/{locations-J4G5RNPH.js → locations-6XADFU3V.js} +4 -4
- package/dist/{log-S7TEGEPL.js → log-I3MAU44R.js} +5 -5
- package/dist/{make-F6FOFAS4.js → make-ALBJZKJZ.js} +21 -21
- package/dist/{map-V3YC6Y5I.js → map-OT6F33VF.js} +6 -6
- package/dist/{mcp-3R3FOL2H.js → mcp-LC3L2JQO.js} +4 -4
- package/dist/{media-53DJRC4N.js → media-MYZ5I7WK.js} +2 -2
- package/dist/{media-sources-356UORTR.js → media-sources-RK6EJYBQ.js} +2 -2
- package/dist/{members-KATLJNPJ.js → members-7CHDHW7H.js} +5 -5
- package/dist/{meta-A7KM6TF5.js → meta-7XP5AWYU.js} +10 -10
- package/dist/{metrics-SQDJ5NQO.js → metrics-73LI743C.js} +4 -4
- package/dist/{normalize-RUPEDCAV.js → normalize-CXMYHNSA.js} +5 -5
- package/dist/{options-SCYGSRQX.js → options-E4IO5SR5.js} +8 -8
- package/dist/{performance-U3MA6YXN.js → performance-UQLSBPYN.js} +6 -6
- package/dist/{plan-4QP2G7GV.js → plan-NBFLYAOW.js} +2 -2
- package/dist/{promoted-tweet-writes-5UMGETBC.js → promoted-tweet-writes-ZW3FUPFG.js} +5 -5
- package/dist/{promoted-tweets-A3V53KZI.js → promoted-tweets-ZLQ6GZD5.js} +3 -3
- package/dist/{publish-V22K43GA.js → publish-H2PBR5XN.js} +5 -5
- package/dist/query-GDUTZ4R7.js +61 -0
- package/dist/{reddit-UACCQN3B.js → reddit-TGQYQUNZ.js} +6 -6
- package/dist/{refresh-PSXGRCJE.js → refresh-HVBCC2ZI.js} +4 -4
- package/dist/{release-S2X7UL4U.js → release-VI3JT6O6.js} +5 -5
- package/dist/{relevant-pages-OWMNUCP7.js → relevant-pages-2FW3E5KD.js} +4 -4
- package/dist/{remove-4GTKRBUW.js → remove-4EE7STMS.js} +4 -4
- package/dist/{reopen-3KUS6UZ2.js → reopen-LEGLAOMA.js} +5 -5
- package/dist/{rerun-ZHD7C4W2.js → rerun-A5DPZFOO.js} +14 -14
- package/dist/{research-7LO3G3EP.js → research-O6YMV2TG.js} +13 -13
- package/dist/{research-UF6PKQPH.js → research-WOJELJ4K.js} +4 -4
- package/dist/{reset-PVXTS3FZ.js → reset-PQHURJDC.js} +4 -4
- package/dist/{reset-PU57HTAP.js → reset-V2X7DFHD.js} +4 -4
- package/dist/{resolve-KBIYWRF7.js → resolve-Q4AACDIC.js} +5 -5
- package/dist/{retry-HKWNIGON.js → retry-BB6NJBC4.js} +4 -4
- package/dist/{retry-LSCVGZM5.js → retry-WMGEUJPB.js} +4 -4
- package/dist/{run-HMFS4KQZ.js → run-OBYA2F3E.js} +14 -14
- package/dist/{run-DU6RVXPA.js → run-V6E36GXW.js} +5 -5
- package/dist/{scaffold-ad-SLUGKZIW.js → scaffold-ad-KKYI7FZJ.js} +10 -10
- package/dist/{scaffold-static-ad-NRFAA5HL.js → scaffold-static-ad-R5UE4YIZ.js} +16 -16
- package/dist/{scaffold-video-Q7BSFVS4.js → scaffold-video-Y2BWXZSX.js} +12 -12
- package/dist/{schedule-VNTGMFLQ.js → schedule-EO27AZTT.js} +4 -4
- package/dist/{scheduled-agents-6TNWXJVH.js → scheduled-agents-OIJBX7OO.js} +11 -11
- package/dist/{schema-ZEOL467O.js → schema-7GSCTQIC.js} +6 -6
- package/dist/{search-XUINK3C2.js → search-Q7PAV7NY.js} +4 -4
- package/dist/{select-U3DVKV72.js → select-ASR5SBYE.js} +9 -9
- package/dist/{set-prompt-EQIVJ5LR.js → set-prompt-I32464V4.js} +7 -7
- package/dist/{setup-links-CLPE6UUM.js → setup-links-NP2HULRC.js} +5 -5
- package/dist/{site-GIZB7NWB.js → site-PTIYQQ3Z.js} +6 -6
- package/dist/{sources-7RGXA35S.js → sources-5FRMFKDA.js} +6 -6
- package/dist/{sources-2PG4U4BC.js → sources-FJLCIG6X.js} +8 -8
- package/dist/{stale-ODM7IOO2.js → stale-YUYMETFC.js} +8 -8
- package/dist/{stats-NNXZMPZR.js → stats-F5JZVPYG.js} +1 -1
- package/dist/{status-HKCIXG7P.js → status-UYIQFC7L.js} +5 -5
- package/dist/{studio-EKIPLLHD.js → studio-6ZL76TZR.js} +1 -1
- package/dist/{sync-LGDTHM6C.js → sync-527ZCA4A.js} +4 -4
- package/dist/{sync-definition-6WBQN4Q3.js → sync-definition-M4KRPGTN.js} +9 -9
- package/dist/sync-definition-M4KRPGTN.js.map +1 -0
- package/dist/{tags-BQFPK55V.js → tags-2MX3332V.js} +5 -5
- package/dist/{tags-N72F6AMR.js → tags-7767I2D6.js} +4 -4
- package/dist/{tags-DRZ7GPP4.js → tags-J3BGX3E6.js} +5 -5
- package/dist/{tags-Q5NWILJO.js → tags-O27SK3YX.js} +4 -4
- package/dist/{tags-4NICM2LC.js → tags-VAYVSQM6.js} +5 -5
- package/dist/{targeting-criteria-DXHMEEC2.js → targeting-criteria-GOTI75Y4.js} +3 -3
- package/dist/{targets-A325AP5G.js → targets-FC7CGFRD.js} +5 -5
- package/dist/{templates-WWY4ZVKR.js → templates-EF5LOWP5.js} +5 -5
- package/dist/{testimonials-YVHSZTWW.js → testimonials-MRMRWF2T.js} +6 -6
- package/dist/themes-2ZV7OCJ3.js +94 -0
- package/dist/themes-2ZV7OCJ3.js.map +1 -0
- package/dist/{top-companies-S2Y4I5HF.js → top-companies-VTLR6GTW.js} +5 -5
- package/dist/{translate-BTUMXQSK.js → translate-UMTKAUJ3.js} +15 -15
- package/dist/{triggers-T47AIYVB.js → triggers-Y7ZMMY3C.js} +5 -5
- package/dist/{unlink-XRKX6DVP.js → unlink-HZCFLXH4.js} +5 -5
- package/dist/{unstage-77RAGX3F.js → unstage-562HOOE7.js} +5 -5
- package/dist/{update-R3QSTHUD.js → update-ATSXY5UN.js} +5 -5
- package/dist/{update-RJLMUP7I.js → update-DKU2UDFA.js} +4 -4
- package/dist/{update-YRO5IHDX.js → update-I5A5TOZJ.js} +5 -5
- package/dist/{update-NQIRRGOW.js → update-ZF3VFYLB.js} +5 -5
- package/dist/{upload-KWFKNKAF.js → upload-SIAI6NMH.js} +5 -5
- package/dist/{url-options-GGXAL3J4.js → url-options-JSX6HBZL.js} +10 -7
- package/dist/url-options-JSX6HBZL.js.map +1 -0
- package/dist/{url-params-IMC43AIM.js → url-params-AZUI3CW3.js} +5 -5
- package/dist/{validate-Y6R6F5T3.js → validate-MC4EIQI5.js} +7 -7
- package/dist/{videos-U2FPMNFS.js → videos-S7BYFSU3.js} +5 -5
- package/dist/{web-AHTOJNQY.js → web-5R7LHKIT.js} +5 -5
- package/dist/{winning-ads-TUYN2BST.js → winning-ads-PDCY4YW5.js} +2 -2
- package/dist/{write-commands-CT74VHH6.js → write-commands-MFRZD6Q6.js} +4 -4
- package/dist/{write-commands-2XFNH4BW.js → write-commands-VXL5QKMT.js} +7 -7
- package/dist/{x-5GDVUJ2I.js → x-22PKVRYX.js} +7 -7
- package/package.json +1 -1
- package/dist/chunk-GX6VAHY7.js.map +0 -1
- package/dist/chunk-LLOOWRBB.js.map +0 -1
- package/dist/chunk-NE4F3FHN.js +0 -1854
- package/dist/chunk-NE4F3FHN.js.map +0 -1
- package/dist/chunk-XCM6XWOB.js +0 -417
- package/dist/chunk-XCM6XWOB.js.map +0 -1
- package/dist/chunk-ZJWUBJYQ.js.map +0 -1
- package/dist/credentials-4V55RYZ6.js.map +0 -1
- package/dist/draft-5YAYCEYY.js +0 -107
- package/dist/draft-5YAYCEYY.js.map +0 -1
- package/dist/google-M7KEXVK5.js.map +0 -1
- package/dist/query-IEZRY6HV.js.map +0 -1
- package/dist/url-options-GGXAL3J4.js.map +0 -1
- /package/dist/{account-2OBWFPRG.js.map → account-AO6PNNPO.js.map} +0 -0
- /package/dist/{accounts-TDTME6RQ.js.map → accounts-4TM4UZEJ.js.map} +0 -0
- /package/dist/{accounts-TZQVAJ3V.js.map → accounts-XDC26KK6.js.map} +0 -0
- /package/dist/{actions-FHYESJEE.js.map → actions-CJB4GZYA.js.map} +0 -0
- /package/dist/{add-Q6YFHEOR.js.map → add-BP4CUUKB.js.map} +0 -0
- /package/dist/{add-7XB5X3D3.js.map → add-RYR3QGOP.js.map} +0 -0
- /package/dist/{ads-PGTFZA5Q.js.map → ads-GII5LEOH.js.map} +0 -0
- /package/dist/{ads-6UEDYT3O.js.map → ads-SATXH4OD.js.map} +0 -0
- /package/dist/{adsets-Q5DWGANV.js.map → adsets-PMXNW3EG.js.map} +0 -0
- /package/dist/{advertisers-RKWQDCOI.js.map → advertisers-GM5UFI44.js.map} +0 -0
- /package/dist/{analytics-DEJKJNLN.js.map → analytics-4CD7CH7H.js.map} +0 -0
- /package/dist/{analytics-U5TTTX7K.js.map → analytics-JDPRLCHQ.js.map} +0 -0
- /package/dist/{assign-RHUKQWH2.js.map → assign-XI4HIIIM.js.map} +0 -0
- /package/dist/{audience-size-ICEKQRE4.js.map → audience-size-DHZ65PGA.js.map} +0 -0
- /package/dist/{audiences-AMRFZRZ7.js.map → audiences-D7CXP3ZF.js.map} +0 -0
- /package/dist/{audit-GWLQVB4A.js.map → audit-M7BZYBIS.js.map} +0 -0
- /package/dist/{autocomplete-NAEVFMKZ.js.map → autocomplete-B45I26R4.js.map} +0 -0
- /package/dist/{avatars-PMV6IMFV.js.map → avatars-75BALNB7.js.map} +0 -0
- /package/dist/{bid-pricing-XF3LD65L.js.map → bid-pricing-4RCP24BE.js.map} +0 -0
- /package/dist/{brand-ZC5HDP7B.js.map → brand-2TOLKYDY.js.map} +0 -0
- /package/dist/{brief-3EZ2JS5F.js.map → brief-5G4NEZ4O.js.map} +0 -0
- /package/dist/{campaign-groups-JSHBFYDG.js.map → campaign-groups-G7B26V7K.js.map} +0 -0
- /package/dist/{campaign-writes-5PHXENPN.js.map → campaign-writes-HZ7ART7W.js.map} +0 -0
- /package/dist/{campaigns-D6B6Z67Y.js.map → campaigns-MEEM3CNC.js.map} +0 -0
- /package/dist/{campaigns-HPRQVXTH.js.map → campaigns-OIJGTO7W.js.map} +0 -0
- /package/dist/{campaigns-LQXELRHZ.js.map → campaigns-RW3QJQ2F.js.map} +0 -0
- /package/dist/{canvas-4NVEZNW5.js.map → canvas-LXRLDE5G.js.map} +0 -0
- /package/dist/{capabilities-VQRNPBOZ.js.map → capabilities-BWSB7IFT.js.map} +0 -0
- /package/dist/{changes-TP7ZZHB3.js.map → changes-AYLNY6KN.js.map} +0 -0
- /package/dist/{chatgpt-QNUN63YS.js.map → chatgpt-TNSRA3L3.js.map} +0 -0
- /package/dist/{chats-Q4QPA3OQ.js.map → chats-MMHBJQFM.js.map} +0 -0
- /package/dist/{chunk-RXGR63TP.js.map → chunk-24GELJP3.js.map} +0 -0
- /package/dist/{chunk-ZKYNGME7.js.map → chunk-2D4ASTGN.js.map} +0 -0
- /package/dist/{chunk-PRIHMSJH.js.map → chunk-2K4LMCV2.js.map} +0 -0
- /package/dist/{chunk-4GACYQUI.js.map → chunk-2YJL6MEB.js.map} +0 -0
- /package/dist/{chunk-L27H2R2N.js.map → chunk-2ZY7HON7.js.map} +0 -0
- /package/dist/{chunk-RZTNH2TX.js.map → chunk-45OQOUJA.js.map} +0 -0
- /package/dist/{chunk-YT2BSTD3.js.map → chunk-7TNPEURJ.js.map} +0 -0
- /package/dist/{chunk-WKS6ZDUP.js.map → chunk-BSOWFWEU.js.map} +0 -0
- /package/dist/{chunk-X5ECCSHP.js.map → chunk-D23EKXOP.js.map} +0 -0
- /package/dist/{chunk-FC3U5XKS.js.map → chunk-D7PFF6UC.js.map} +0 -0
- /package/dist/{chunk-OU5YA2QX.js.map → chunk-DT2XXF6O.js.map} +0 -0
- /package/dist/{chunk-ARBKEE6E.js.map → chunk-DYOI4FQ7.js.map} +0 -0
- /package/dist/{chunk-4EVLVA2R.js.map → chunk-EFM7OODQ.js.map} +0 -0
- /package/dist/{chunk-P6KWFODZ.js.map → chunk-EIIANSBX.js.map} +0 -0
- /package/dist/{chunk-HJMRWBR5.js.map → chunk-EYK6G4XE.js.map} +0 -0
- /package/dist/{chunk-PKC6QBYJ.js.map → chunk-EZWYX343.js.map} +0 -0
- /package/dist/{chunk-LIQ4SQ2T.js.map → chunk-FEELV5IV.js.map} +0 -0
- /package/dist/{chunk-YCWIGXH6.js.map → chunk-GP7QUF5A.js.map} +0 -0
- /package/dist/{chunk-ZGGGA3JR.js.map → chunk-HOXZOOVA.js.map} +0 -0
- /package/dist/{chunk-TJOGO2MK.js.map → chunk-JU7FIHQ2.js.map} +0 -0
- /package/dist/{chunk-MVYLY2SF.js.map → chunk-KN7DFVKW.js.map} +0 -0
- /package/dist/{chunk-K5H3XOYQ.js.map → chunk-LI6PGY3L.js.map} +0 -0
- /package/dist/{chunk-3KEWXALS.js.map → chunk-MCWYIEWI.js.map} +0 -0
- /package/dist/{chunk-LIWBVGRE.js.map → chunk-MFQ5SUJT.js.map} +0 -0
- /package/dist/{chunk-HEOWTR7Z.js.map → chunk-OW4XDJV2.js.map} +0 -0
- /package/dist/{chunk-KYR4EG3E.js.map → chunk-PHEEJUFL.js.map} +0 -0
- /package/dist/{chunk-KHV5GALI.js.map → chunk-QNDLOCAI.js.map} +0 -0
- /package/dist/{chunk-GQ7JE7A7.js.map → chunk-UZUHXN7H.js.map} +0 -0
- /package/dist/{chunk-YWK4UBVU.js.map → chunk-V5QJBDBC.js.map} +0 -0
- /package/dist/{chunk-LP2QDRO4.js.map → chunk-WBUMUELD.js.map} +0 -0
- /package/dist/{chunk-EP5TYLNV.js.map → chunk-WEU6GKUQ.js.map} +0 -0
- /package/dist/{chunk-46TPPYCI.js.map → chunk-X5VHGXFB.js.map} +0 -0
- /package/dist/{chunk-3V57D7GE.js.map → chunk-XJRBFLBD.js.map} +0 -0
- /package/dist/{chunk-QS2BDKFL.js.map → chunk-Y63Y4QSY.js.map} +0 -0
- /package/dist/{chunk-PAQ3T6OT.js.map → chunk-YRVDCIJ2.js.map} +0 -0
- /package/dist/{claim-RHZVTMQZ.js.map → claim-UDNXCJIU.js.map} +0 -0
- /package/dist/{companies-LIKSVYSR.js.map → companies-RPZN4JTR.js.map} +0 -0
- /package/dist/{complete-OM7R6VOC.js.map → complete-HLSRQE3N.js.map} +0 -0
- /package/dist/{connect-AVX3NKP6.js.map → connect-TIJZO7OV.js.map} +0 -0
- /package/dist/{conversation-3HGRWXKO.js.map → conversation-BS7TF6LZ.js.map} +0 -0
- /package/dist/{conversion-upload-command-AUF3LNTH.js.map → conversion-upload-command-CSD344BY.js.map} +0 -0
- /package/dist/{conversions-XADFSQ4W.js.map → conversions-FEWAX64H.js.map} +0 -0
- /package/dist/{create-PQSDE4J3.js.map → create-4SH4BZXP.js.map} +0 -0
- /package/dist/{create-BWHYYATN.js.map → create-B4UVIJZI.js.map} +0 -0
- /package/dist/{create-Z4JLLTPG.js.map → create-F5FNHJKE.js.map} +0 -0
- /package/dist/{create-3I64N6RJ.js.map → create-L3JHP6J4.js.map} +0 -0
- /package/dist/{creatives-WPRN6CU4.js.map → creatives-LK2NZHRX.js.map} +0 -0
- /package/dist/{creatives-UEPLNCPN.js.map → creatives-RQ2DFHGI.js.map} +0 -0
- /package/dist/{creatives-6Z7CEW5O.js.map → creatives-UILBPOKO.js.map} +0 -0
- /package/dist/{critique-M5TMIG2D.js.map → critique-FAOH4FCP.js.map} +0 -0
- /package/dist/{critique-K632OHFP.js.map → critique-X7HYYEJ4.js.map} +0 -0
- /package/dist/{crm-CWT6BMMX.js.map → crm-RB5TVV3M.js.map} +0 -0
- /package/dist/{crm-Q2QK4ZMS.js.map → crm-XEQDSU2U.js.map} +0 -0
- /package/dist/{currency-XCGKQ7FE.js.map → currency-47QHFHDA.js.map} +0 -0
- /package/dist/{custom-conversions-2VLJGPRV.js.map → custom-conversions-7HOWR6X6.js.map} +0 -0
- /package/dist/{customers-7TS64ZM5.js.map → customers-P5WOUY6G.js.map} +0 -0
- /package/dist/{delete-H7W3V6QG.js.map → delete-DLQ2ZZDA.js.map} +0 -0
- /package/dist/{delete-BPSOLCGB.js.map → delete-GZKGPBBD.js.map} +0 -0
- /package/dist/{delete-RIY5VUTU.js.map → delete-SW5OSIGN.js.map} +0 -0
- /package/dist/{demographics-NHGM4QP7.js.map → demographics-ZLZOIWUE.js.map} +0 -0
- /package/dist/{discard-IBMOGEYB.js.map → discard-VNVNJWNX.js.map} +0 -0
- /package/dist/{discover-BJPZNXUQ.js.map → discover-P6TUGZ45.js.map} +0 -0
- /package/dist/{domain-Y3N2UY5I.js.map → domain-OBICRJP3.js.map} +0 -0
- /package/dist/{draft-322ZG6JG.js.map → draft-UECMJ6B4.js.map} +0 -0
- /package/dist/{draft-6KBILDJK.js.map → draft-V75RBORX.js.map} +0 -0
- /package/dist/{draft-P5T2QHCY.js.map → draft-Z3VUQ4LJ.js.map} +0 -0
- /package/dist/{facets-3SDK42HY.js.map → facets-7J66L3NK.js.map} +0 -0
- /package/dist/{feedback-P2JZTJY5.js.map → feedback-3LDG4WVJ.js.map} +0 -0
- /package/dist/{feedback-record-5O6UUWTZ.js.map → feedback-record-CTAUHLMF.js.map} +0 -0
- /package/dist/{fetch-LN5W3J4E.js.map → fetch-4RXXZGO4.js.map} +0 -0
- /package/dist/{flows-MN26KBWB.js.map → flows-GGB46DLH.js.map} +0 -0
- /package/dist/{fonts-7TXPTNCS.js.map → fonts-S3GWKOUJ.js.map} +0 -0
- /package/dist/{forecast-ZHBKYQFP.js.map → forecast-6JVKXNFB.js.map} +0 -0
- /package/dist/{funnel-UAXVM7JN.js.map → funnel-RCQOIQZ5.js.map} +0 -0
- /package/dist/{ga4-DV2AXCSL.js.map → ga4-U6DMJ6K4.js.map} +0 -0
- /package/dist/{get-EKYSQHNB.js.map → get-KQSM2MXM.js.map} +0 -0
- /package/dist/{get-P7SSZ46N.js.map → get-MN2GRXGZ.js.map} +0 -0
- /package/dist/{google-ads-LZDXDFPW.js.map → google-ads-YAJ33LTW.js.map} +0 -0
- /package/dist/{history-BFGVCJ4J.js.map → history-QWYLRQBO.js.map} +0 -0
- /package/dist/{hubspot-I3PNNF3E.js.map → hubspot-DDONLJ7R.js.map} +0 -0
- /package/dist/{ideas-ZNP5BOGE.js.map → ideas-N44Z2SIT.js.map} +0 -0
- /package/dist/{images-MWWGN672.js.map → images-BKHCBCE7.js.map} +0 -0
- /package/dist/{ingest-H7BWHY7L.js.map → ingest-HBECWLOB.js.map} +0 -0
- /package/dist/{ingest-NYP2ZAAK.js.map → ingest-VNRTFD4Y.js.map} +0 -0
- /package/dist/{inspect-FNNDBZQX.js.map → inspect-7GGJDJBJ.js.map} +0 -0
- /package/dist/{inspiration-S3DU4CMQ.js.map → inspiration-CGM3NK6X.js.map} +0 -0
- /package/dist/{intent-E3UIVZBN.js.map → intent-HKNBXEDS.js.map} +0 -0
- /package/dist/{keyword-gap-BG6M665A.js.map → keyword-gap-HUSP6MOT.js.map} +0 -0
- /package/dist/{keyword-metrics-WG5LLBUW.js.map → keyword-metrics-2C3VFGDQ.js.map} +0 -0
- /package/dist/{keywords-for-site-HVEAAODA.js.map → keywords-for-site-4GV4KS4X.js.map} +0 -0
- /package/dist/{landing-G5MLO4CZ.js.map → landing-V2FMPQOK.js.map} +0 -0
- /package/dist/{languages-HORKPDNH.js.map → languages-75YJZAHL.js.map} +0 -0
- /package/dist/{leads-XCAE4OVV.js.map → leads-DTULNGMU.js.map} +0 -0
- /package/dist/{leads-ARUWPHBM.js.map → leads-OPRVJBQG.js.map} +0 -0
- /package/dist/{learn-5WSN4PT5.js.map → learn-EW2CKOFS.js.map} +0 -0
- /package/dist/{line-item-writes-4EOQBQSC.js.map → line-item-writes-EF3BJ5KV.js.map} +0 -0
- /package/dist/{line-items-45X5BVQW.js.map → line-items-G467XOZF.js.map} +0 -0
- /package/dist/{link-XAXNBIKU.js.map → link-5SU4MR6M.js.map} +0 -0
- /package/dist/{linkedin-62HOT3HB.js.map → linkedin-OFM3VVOB.js.map} +0 -0
- /package/dist/{list-PLWORN75.js.map → list-HEWXAVCL.js.map} +0 -0
- /package/dist/{list-NYTQ3DBH.js.map → list-SUTCQLGI.js.map} +0 -0
- /package/dist/{list-H4SN4QYE.js.map → list-VFZPXFMA.js.map} +0 -0
- /package/dist/{locations-J4G5RNPH.js.map → locations-6XADFU3V.js.map} +0 -0
- /package/dist/{log-S7TEGEPL.js.map → log-I3MAU44R.js.map} +0 -0
- /package/dist/{make-F6FOFAS4.js.map → make-ALBJZKJZ.js.map} +0 -0
- /package/dist/{map-V3YC6Y5I.js.map → map-OT6F33VF.js.map} +0 -0
- /package/dist/{mcp-3R3FOL2H.js.map → mcp-LC3L2JQO.js.map} +0 -0
- /package/dist/{media-53DJRC4N.js.map → media-MYZ5I7WK.js.map} +0 -0
- /package/dist/{media-sources-356UORTR.js.map → media-sources-RK6EJYBQ.js.map} +0 -0
- /package/dist/{members-KATLJNPJ.js.map → members-7CHDHW7H.js.map} +0 -0
- /package/dist/{meta-A7KM6TF5.js.map → meta-7XP5AWYU.js.map} +0 -0
- /package/dist/{metrics-SQDJ5NQO.js.map → metrics-73LI743C.js.map} +0 -0
- /package/dist/{normalize-RUPEDCAV.js.map → normalize-CXMYHNSA.js.map} +0 -0
- /package/dist/{options-SCYGSRQX.js.map → options-E4IO5SR5.js.map} +0 -0
- /package/dist/{performance-U3MA6YXN.js.map → performance-UQLSBPYN.js.map} +0 -0
- /package/dist/{plan-4QP2G7GV.js.map → plan-NBFLYAOW.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-5UMGETBC.js.map → promoted-tweet-writes-ZW3FUPFG.js.map} +0 -0
- /package/dist/{promoted-tweets-A3V53KZI.js.map → promoted-tweets-ZLQ6GZD5.js.map} +0 -0
- /package/dist/{publish-V22K43GA.js.map → publish-H2PBR5XN.js.map} +0 -0
- /package/dist/{reddit-UACCQN3B.js.map → query-GDUTZ4R7.js.map} +0 -0
- /package/dist/{run-HMFS4KQZ.js.map → reddit-TGQYQUNZ.js.map} +0 -0
- /package/dist/{refresh-PSXGRCJE.js.map → refresh-HVBCC2ZI.js.map} +0 -0
- /package/dist/{release-S2X7UL4U.js.map → release-VI3JT6O6.js.map} +0 -0
- /package/dist/{relevant-pages-OWMNUCP7.js.map → relevant-pages-2FW3E5KD.js.map} +0 -0
- /package/dist/{remove-4GTKRBUW.js.map → remove-4EE7STMS.js.map} +0 -0
- /package/dist/{reopen-3KUS6UZ2.js.map → reopen-LEGLAOMA.js.map} +0 -0
- /package/dist/{rerun-ZHD7C4W2.js.map → rerun-A5DPZFOO.js.map} +0 -0
- /package/dist/{research-7LO3G3EP.js.map → research-O6YMV2TG.js.map} +0 -0
- /package/dist/{research-UF6PKQPH.js.map → research-WOJELJ4K.js.map} +0 -0
- /package/dist/{reset-PVXTS3FZ.js.map → reset-PQHURJDC.js.map} +0 -0
- /package/dist/{reset-PU57HTAP.js.map → reset-V2X7DFHD.js.map} +0 -0
- /package/dist/{resolve-KBIYWRF7.js.map → resolve-Q4AACDIC.js.map} +0 -0
- /package/dist/{retry-HKWNIGON.js.map → retry-BB6NJBC4.js.map} +0 -0
- /package/dist/{retry-LSCVGZM5.js.map → retry-WMGEUJPB.js.map} +0 -0
- /package/dist/{sync-definition-6WBQN4Q3.js.map → run-OBYA2F3E.js.map} +0 -0
- /package/dist/{run-DU6RVXPA.js.map → run-V6E36GXW.js.map} +0 -0
- /package/dist/{scaffold-ad-SLUGKZIW.js.map → scaffold-ad-KKYI7FZJ.js.map} +0 -0
- /package/dist/{scaffold-static-ad-NRFAA5HL.js.map → scaffold-static-ad-R5UE4YIZ.js.map} +0 -0
- /package/dist/{scaffold-video-Q7BSFVS4.js.map → scaffold-video-Y2BWXZSX.js.map} +0 -0
- /package/dist/{schedule-VNTGMFLQ.js.map → schedule-EO27AZTT.js.map} +0 -0
- /package/dist/{scheduled-agents-6TNWXJVH.js.map → scheduled-agents-OIJBX7OO.js.map} +0 -0
- /package/dist/{schema-ZEOL467O.js.map → schema-7GSCTQIC.js.map} +0 -0
- /package/dist/{search-XUINK3C2.js.map → search-Q7PAV7NY.js.map} +0 -0
- /package/dist/{select-U3DVKV72.js.map → select-ASR5SBYE.js.map} +0 -0
- /package/dist/{set-prompt-EQIVJ5LR.js.map → set-prompt-I32464V4.js.map} +0 -0
- /package/dist/{setup-links-CLPE6UUM.js.map → setup-links-NP2HULRC.js.map} +0 -0
- /package/dist/{site-GIZB7NWB.js.map → site-PTIYQQ3Z.js.map} +0 -0
- /package/dist/{sources-7RGXA35S.js.map → sources-5FRMFKDA.js.map} +0 -0
- /package/dist/{sources-2PG4U4BC.js.map → sources-FJLCIG6X.js.map} +0 -0
- /package/dist/{stale-ODM7IOO2.js.map → stale-YUYMETFC.js.map} +0 -0
- /package/dist/{stats-NNXZMPZR.js.map → stats-F5JZVPYG.js.map} +0 -0
- /package/dist/{status-HKCIXG7P.js.map → status-UYIQFC7L.js.map} +0 -0
- /package/dist/{studio-EKIPLLHD.js.map → studio-6ZL76TZR.js.map} +0 -0
- /package/dist/{sync-LGDTHM6C.js.map → sync-527ZCA4A.js.map} +0 -0
- /package/dist/{tags-BQFPK55V.js.map → tags-2MX3332V.js.map} +0 -0
- /package/dist/{tags-N72F6AMR.js.map → tags-7767I2D6.js.map} +0 -0
- /package/dist/{tags-DRZ7GPP4.js.map → tags-J3BGX3E6.js.map} +0 -0
- /package/dist/{tags-Q5NWILJO.js.map → tags-O27SK3YX.js.map} +0 -0
- /package/dist/{tags-4NICM2LC.js.map → tags-VAYVSQM6.js.map} +0 -0
- /package/dist/{targeting-criteria-DXHMEEC2.js.map → targeting-criteria-GOTI75Y4.js.map} +0 -0
- /package/dist/{targets-A325AP5G.js.map → targets-FC7CGFRD.js.map} +0 -0
- /package/dist/{templates-WWY4ZVKR.js.map → templates-EF5LOWP5.js.map} +0 -0
- /package/dist/{testimonials-YVHSZTWW.js.map → testimonials-MRMRWF2T.js.map} +0 -0
- /package/dist/{top-companies-S2Y4I5HF.js.map → top-companies-VTLR6GTW.js.map} +0 -0
- /package/dist/{translate-BTUMXQSK.js.map → translate-UMTKAUJ3.js.map} +0 -0
- /package/dist/{triggers-T47AIYVB.js.map → triggers-Y7ZMMY3C.js.map} +0 -0
- /package/dist/{unlink-XRKX6DVP.js.map → unlink-HZCFLXH4.js.map} +0 -0
- /package/dist/{unstage-77RAGX3F.js.map → unstage-562HOOE7.js.map} +0 -0
- /package/dist/{update-R3QSTHUD.js.map → update-ATSXY5UN.js.map} +0 -0
- /package/dist/{update-RJLMUP7I.js.map → update-DKU2UDFA.js.map} +0 -0
- /package/dist/{update-YRO5IHDX.js.map → update-I5A5TOZJ.js.map} +0 -0
- /package/dist/{update-NQIRRGOW.js.map → update-ZF3VFYLB.js.map} +0 -0
- /package/dist/{upload-KWFKNKAF.js.map → upload-SIAI6NMH.js.map} +0 -0
- /package/dist/{url-params-IMC43AIM.js.map → url-params-AZUI3CW3.js.map} +0 -0
- /package/dist/{validate-Y6R6F5T3.js.map → validate-MC4EIQI5.js.map} +0 -0
- /package/dist/{videos-U2FPMNFS.js.map → videos-S7BYFSU3.js.map} +0 -0
- /package/dist/{web-AHTOJNQY.js.map → web-5R7LHKIT.js.map} +0 -0
- /package/dist/{winning-ads-TUYN2BST.js.map → winning-ads-PDCY4YW5.js.map} +0 -0
- /package/dist/{write-commands-CT74VHH6.js.map → write-commands-MFRZD6Q6.js.map} +0 -0
- /package/dist/{write-commands-2XFNH4BW.js.map → write-commands-VXL5QKMT.js.map} +0 -0
- /package/dist/{x-5GDVUJ2I.js.map → x-22PKVRYX.js.map} +0 -0
package/dist/chunk-XCM6XWOB.js
DELETED
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
NUMERIC_ID_REGEX
|
|
3
|
-
} from "./chunk-NE4F3FHN.js";
|
|
4
|
-
|
|
5
|
-
// ../api/src/ads-google/change-history.ts
|
|
6
|
-
var CHANGE_SCOPES = ["detail", "summary"];
|
|
7
|
-
var CHANGE_SCOPE_MAX_DAYS = {
|
|
8
|
-
detail: 30,
|
|
9
|
-
summary: 90
|
|
10
|
-
};
|
|
11
|
-
var DEFAULT_CHANGE_DAYS = 7;
|
|
12
|
-
var MAX_CHANGE_DAYS = CHANGE_SCOPE_MAX_DAYS.summary;
|
|
13
|
-
function isChangeLookbackWithinReach(days, scope) {
|
|
14
|
-
return days <= CHANGE_SCOPE_MAX_DAYS[scope];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// ../api/src/ads-google/url-options.ts
|
|
18
|
-
import { z } from "zod";
|
|
19
|
-
var URL_OPTION_LEVELS = ["account", "campaign", "ad_group", "ad"];
|
|
20
|
-
var googleUrlOptionValueSchema = z.discriminatedUnion("state", [
|
|
21
|
-
z.object({ state: z.literal("set"), value: z.string() }),
|
|
22
|
-
z.object({ state: z.literal("not_set") }),
|
|
23
|
-
z.object({ state: z.literal("not_read"), reason: z.string() })
|
|
24
|
-
]);
|
|
25
|
-
var googleUrlOptionsRequestSchema = z.object({
|
|
26
|
-
customerId: z.string().regex(NUMERIC_ID_REGEX, "customerId must be the bare numeric customer id"),
|
|
27
|
-
managerId: z.string().optional(),
|
|
28
|
-
/** Compact by default: only campaigns that actually override the account. `full` lists every campaign. */
|
|
29
|
-
full: z.boolean().optional(),
|
|
30
|
-
skipCache: z.boolean().optional()
|
|
31
|
-
});
|
|
32
|
-
var googleUrlOptionsCampaignSchema = z.object({
|
|
33
|
-
id: z.string(),
|
|
34
|
-
name: z.string(),
|
|
35
|
-
status: z.string(),
|
|
36
|
-
final_url_suffix: googleUrlOptionValueSchema,
|
|
37
|
-
tracking_url_template: googleUrlOptionValueSchema
|
|
38
|
-
});
|
|
39
|
-
var googleUrlOptionsResponseSchema = z.object({
|
|
40
|
-
customer_id: z.string(),
|
|
41
|
-
account: z.object({
|
|
42
|
-
level: z.literal("account"),
|
|
43
|
-
read: z.boolean(),
|
|
44
|
-
final_url_suffix: googleUrlOptionValueSchema,
|
|
45
|
-
tracking_url_template: googleUrlOptionValueSchema
|
|
46
|
-
}),
|
|
47
|
-
campaigns: z.object({
|
|
48
|
-
level: z.literal("campaign"),
|
|
49
|
-
read: z.boolean(),
|
|
50
|
-
/** Campaigns actually observed. 0 with `read: true` means the account has no non-removed campaigns. */
|
|
51
|
-
campaigns_read: z.number().int().nonnegative(),
|
|
52
|
-
/** Campaigns observed to carry no override of their own — an explicit finding, not an omission. */
|
|
53
|
-
campaigns_without_override: z.number().int().nonnegative(),
|
|
54
|
-
overrides: z.array(googleUrlOptionsCampaignSchema),
|
|
55
|
-
/** Compact mode only: campaigns read but not listed because they carry no override. */
|
|
56
|
-
omitted: z.number().int().nonnegative()
|
|
57
|
-
}),
|
|
58
|
-
/** Levels this command never queried. Nothing here may be reported as "not configured". */
|
|
59
|
-
levels_not_read: z.array(z.object({ level: z.enum(URL_OPTION_LEVELS), reason: z.string() }))
|
|
60
|
-
});
|
|
61
|
-
var ACCOUNT_URL_OPTIONS_LOCATION = "Google Ads UI \u2192 Admin \u2192 Account settings \u2192 Tracking (account-level tracking template and final URL suffix)";
|
|
62
|
-
var ACCOUNT_URL_OPTIONS_NOT_STAGEABLE = "Account-level URL options are written by a different Google service than the one Baker's staged changes apply through, so they can't be staged or published from here.";
|
|
63
|
-
function isSet(value) {
|
|
64
|
-
return value.state === "set";
|
|
65
|
-
}
|
|
66
|
-
function urlOptionsHints(report) {
|
|
67
|
-
const hints = [];
|
|
68
|
-
const { account, campaigns } = report;
|
|
69
|
-
if (!account.read) {
|
|
70
|
-
hints.push(
|
|
71
|
-
"The account level did NOT read \u2014 its URL options are unknown, not empty. Re-run before telling the user anything about account-wide tagging."
|
|
72
|
-
);
|
|
73
|
-
} else if (account.final_url_suffix.state === "not_set") {
|
|
74
|
-
hints.push(
|
|
75
|
-
`No account-level final URL suffix is set. An account-wide parameter (agency/partner tagging such as utm_agency=\u2026) belongs at the account level so it reaches every ad \u2014 set it in ${ACCOUNT_URL_OPTIONS_LOCATION}. ${ACCOUNT_URL_OPTIONS_NOT_STAGEABLE}`
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
if (!campaigns.read) {
|
|
79
|
-
hints.push(
|
|
80
|
-
"Campaign-level URL options did NOT read \u2014 do not report that no campaign overrides exist. Re-run before concluding."
|
|
81
|
-
);
|
|
82
|
-
} else {
|
|
83
|
-
const overriding = campaigns.overrides.filter((c) => isSet(c.final_url_suffix));
|
|
84
|
-
if (overriding.length > 0) {
|
|
85
|
-
const named = overriding.slice(0, 5).map((c) => c.name || c.id).join(", ");
|
|
86
|
-
hints.push(
|
|
87
|
-
`A campaign's final URL suffix REPLACES the account-level one for that campaign \u2014 it does not merge. ${overriding.length} campaign(s) set their own (${named}${overriding.length > 5 ? ", \u2026" : ""}) and will not pick up an account-wide parameter until their own suffix carries it too. Every other campaign read here inherits the account level normally.`
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const overridingLevelsNotRead = report.levels_not_read.filter((level) => level.level !== "account");
|
|
92
|
-
if (overridingLevelsNotRead.length > 0) {
|
|
93
|
-
hints.push(
|
|
94
|
-
`Not read at this level: ${overridingLevelsNotRead.map((l) => l.level).join(", ")}. A suffix set there still wins over the levels above it.`
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
if (campaigns.omitted > 0) {
|
|
98
|
-
hints.push(`${campaigns.omitted} campaign(s) read with no override of their own are not listed \u2014 pass --full.`);
|
|
99
|
-
}
|
|
100
|
-
return hints;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// ../api/src/ads-google/geo-constants.ts
|
|
104
|
-
var GEO_TARGET_COUNTRIES = {
|
|
105
|
-
"2004": "Afghanistan",
|
|
106
|
-
"2008": "Albania",
|
|
107
|
-
"2010": "Antarctica",
|
|
108
|
-
"2012": "Algeria",
|
|
109
|
-
"2016": "American Samoa",
|
|
110
|
-
"2020": "Andorra",
|
|
111
|
-
"2024": "Angola",
|
|
112
|
-
"2028": "Antigua and Barbuda",
|
|
113
|
-
"2031": "Azerbaijan",
|
|
114
|
-
"2032": "Argentina",
|
|
115
|
-
"2036": "Australia",
|
|
116
|
-
"2040": "Austria",
|
|
117
|
-
"2044": "The Bahamas",
|
|
118
|
-
"2048": "Bahrain",
|
|
119
|
-
"2050": "Bangladesh",
|
|
120
|
-
"2051": "Armenia",
|
|
121
|
-
"2052": "Barbados",
|
|
122
|
-
"2056": "Belgium",
|
|
123
|
-
"2060": "Bermuda",
|
|
124
|
-
"2064": "Bhutan",
|
|
125
|
-
"2068": "Bolivia",
|
|
126
|
-
"2070": "Bosnia and Herzegovina",
|
|
127
|
-
"2072": "Botswana",
|
|
128
|
-
"2074": "Bouvet Island",
|
|
129
|
-
"2076": "Brazil",
|
|
130
|
-
"2084": "Belize",
|
|
131
|
-
"2086": "British Indian Ocean Territory",
|
|
132
|
-
"2090": "Solomon Islands",
|
|
133
|
-
"2092": "British Virgin Islands",
|
|
134
|
-
"2096": "Brunei",
|
|
135
|
-
"2100": "Bulgaria",
|
|
136
|
-
"2104": "Myanmar (Burma)",
|
|
137
|
-
"2108": "Burundi",
|
|
138
|
-
"2112": "Belarus",
|
|
139
|
-
"2116": "Cambodia",
|
|
140
|
-
"2120": "Cameroon",
|
|
141
|
-
"2124": "Canada",
|
|
142
|
-
"2132": "Cabo Verde",
|
|
143
|
-
"2136": "Cayman Islands",
|
|
144
|
-
"2140": "Central African Republic",
|
|
145
|
-
"2144": "Sri Lanka",
|
|
146
|
-
"2148": "Chad",
|
|
147
|
-
"2152": "Chile",
|
|
148
|
-
"2156": "China",
|
|
149
|
-
"2158": "Taiwan",
|
|
150
|
-
"2162": "Christmas Island",
|
|
151
|
-
"2166": "Cocos (Keeling) Islands",
|
|
152
|
-
"2170": "Colombia",
|
|
153
|
-
"2174": "Comoros",
|
|
154
|
-
"2175": "Mayotte",
|
|
155
|
-
"2178": "Republic of the Congo",
|
|
156
|
-
"2180": "Democratic Republic of the Congo",
|
|
157
|
-
"2184": "Cook Islands",
|
|
158
|
-
"2188": "Costa Rica",
|
|
159
|
-
"2191": "Croatia",
|
|
160
|
-
"2196": "Cyprus",
|
|
161
|
-
"2203": "Czechia",
|
|
162
|
-
"2204": "Benin",
|
|
163
|
-
"2208": "Denmark",
|
|
164
|
-
"2212": "Dominica",
|
|
165
|
-
"2214": "Dominican Republic",
|
|
166
|
-
"2218": "Ecuador",
|
|
167
|
-
"2222": "El Salvador",
|
|
168
|
-
"2226": "Equatorial Guinea",
|
|
169
|
-
"2231": "Ethiopia",
|
|
170
|
-
"2232": "Eritrea",
|
|
171
|
-
"2233": "Estonia",
|
|
172
|
-
"2234": "Faroe Islands",
|
|
173
|
-
"2238": "Falkland Islands (Islas Malvinas)",
|
|
174
|
-
"2239": "South Georgia and the South Sandwich Islands",
|
|
175
|
-
"2242": "Fiji",
|
|
176
|
-
"2246": "Finland",
|
|
177
|
-
"2250": "France",
|
|
178
|
-
"2254": "French Guiana",
|
|
179
|
-
"2258": "French Polynesia",
|
|
180
|
-
"2260": "French Southern and Antarctic Lands",
|
|
181
|
-
"2262": "Djibouti",
|
|
182
|
-
"2266": "Gabon",
|
|
183
|
-
"2268": "Georgia",
|
|
184
|
-
"2270": "The Gambia",
|
|
185
|
-
"2275": "Palestine",
|
|
186
|
-
"2276": "Germany",
|
|
187
|
-
"2288": "Ghana",
|
|
188
|
-
"2292": "Gibraltar",
|
|
189
|
-
"2296": "Kiribati",
|
|
190
|
-
"2300": "Greece",
|
|
191
|
-
"2304": "Greenland",
|
|
192
|
-
"2308": "Grenada",
|
|
193
|
-
"2312": "Guadeloupe",
|
|
194
|
-
"2316": "Guam",
|
|
195
|
-
"2320": "Guatemala",
|
|
196
|
-
"2324": "Guinea",
|
|
197
|
-
"2328": "Guyana",
|
|
198
|
-
"2332": "Haiti",
|
|
199
|
-
"2334": "Heard Island and McDonald Islands",
|
|
200
|
-
"2336": "Vatican City",
|
|
201
|
-
"2340": "Honduras",
|
|
202
|
-
"2344": "Hong Kong",
|
|
203
|
-
"2348": "Hungary",
|
|
204
|
-
"2352": "Iceland",
|
|
205
|
-
"2356": "India",
|
|
206
|
-
"2360": "Indonesia",
|
|
207
|
-
"2368": "Iraq",
|
|
208
|
-
"2372": "Ireland",
|
|
209
|
-
"2376": "Israel",
|
|
210
|
-
"2380": "Italy",
|
|
211
|
-
"2384": "Cote d'Ivoire",
|
|
212
|
-
"2388": "Jamaica",
|
|
213
|
-
"2392": "Japan",
|
|
214
|
-
"2398": "Kazakhstan",
|
|
215
|
-
"2400": "Jordan",
|
|
216
|
-
"2404": "Kenya",
|
|
217
|
-
"2410": "South Korea",
|
|
218
|
-
"2414": "Kuwait",
|
|
219
|
-
"2417": "Kyrgyzstan",
|
|
220
|
-
"2418": "Laos",
|
|
221
|
-
"2422": "Lebanon",
|
|
222
|
-
"2426": "Lesotho",
|
|
223
|
-
"2428": "Latvia",
|
|
224
|
-
"2430": "Liberia",
|
|
225
|
-
"2434": "Libya",
|
|
226
|
-
"2438": "Liechtenstein",
|
|
227
|
-
"2440": "Lithuania",
|
|
228
|
-
"2442": "Luxembourg",
|
|
229
|
-
"2446": "Macao",
|
|
230
|
-
"2450": "Madagascar",
|
|
231
|
-
"2454": "Malawi",
|
|
232
|
-
"2458": "Malaysia",
|
|
233
|
-
"2462": "Maldives",
|
|
234
|
-
"2466": "Mali",
|
|
235
|
-
"2470": "Malta",
|
|
236
|
-
"2474": "Martinique",
|
|
237
|
-
"2478": "Mauritania",
|
|
238
|
-
"2480": "Mauritius",
|
|
239
|
-
"2484": "Mexico",
|
|
240
|
-
"2492": "Monaco",
|
|
241
|
-
"2496": "Mongolia",
|
|
242
|
-
"2498": "Moldova",
|
|
243
|
-
"2499": "Montenegro",
|
|
244
|
-
"2500": "Montserrat",
|
|
245
|
-
"2504": "Morocco",
|
|
246
|
-
"2508": "Mozambique",
|
|
247
|
-
"2512": "Oman",
|
|
248
|
-
"2516": "Namibia",
|
|
249
|
-
"2520": "Nauru",
|
|
250
|
-
"2524": "Nepal",
|
|
251
|
-
"2528": "Netherlands",
|
|
252
|
-
"2531": "Curacao",
|
|
253
|
-
"2533": "Aruba",
|
|
254
|
-
"2534": "Sint Maarten",
|
|
255
|
-
"2535": "Caribbean Netherlands",
|
|
256
|
-
"2540": "New Caledonia",
|
|
257
|
-
"2548": "Vanuatu",
|
|
258
|
-
"2554": "New Zealand",
|
|
259
|
-
"2558": "Nicaragua",
|
|
260
|
-
"2562": "Niger",
|
|
261
|
-
"2566": "Nigeria",
|
|
262
|
-
"2570": "Niue",
|
|
263
|
-
"2574": "Norfolk Island",
|
|
264
|
-
"2578": "Norway",
|
|
265
|
-
"2580": "Northern Mariana Islands",
|
|
266
|
-
"2581": "United States Minor Outlying Islands",
|
|
267
|
-
"2583": "Micronesia",
|
|
268
|
-
"2584": "Marshall Islands",
|
|
269
|
-
"2585": "Palau",
|
|
270
|
-
"2586": "Pakistan",
|
|
271
|
-
"2591": "Panama",
|
|
272
|
-
"2598": "Papua New Guinea",
|
|
273
|
-
"2600": "Paraguay",
|
|
274
|
-
"2604": "Peru",
|
|
275
|
-
"2608": "Philippines",
|
|
276
|
-
"2612": "Pitcairn Islands",
|
|
277
|
-
"2616": "Poland",
|
|
278
|
-
"2620": "Portugal",
|
|
279
|
-
"2624": "Guinea-Bissau",
|
|
280
|
-
"2626": "Timor-Leste",
|
|
281
|
-
"2630": "Puerto Rico",
|
|
282
|
-
"2634": "Qatar",
|
|
283
|
-
"2638": "Reunion",
|
|
284
|
-
"2642": "Romania",
|
|
285
|
-
"2643": "Russia",
|
|
286
|
-
"2646": "Rwanda",
|
|
287
|
-
"2652": "Saint Barthelemy",
|
|
288
|
-
"2654": "Saint Helena, Ascension and Tristan da Cunha",
|
|
289
|
-
"2659": "Saint Kitts and Nevis",
|
|
290
|
-
"2660": "Anguilla",
|
|
291
|
-
"2662": "Saint Lucia",
|
|
292
|
-
"2663": "Saint Martin",
|
|
293
|
-
"2666": "Saint Pierre and Miquelon",
|
|
294
|
-
"2670": "Saint Vincent and the Grenadines",
|
|
295
|
-
"2674": "San Marino",
|
|
296
|
-
"2678": "Sao Tome and Principe",
|
|
297
|
-
"2682": "Saudi Arabia",
|
|
298
|
-
"2686": "Senegal",
|
|
299
|
-
"2688": "Serbia",
|
|
300
|
-
"2690": "Seychelles",
|
|
301
|
-
"2694": "Sierra Leone",
|
|
302
|
-
"2702": "Singapore",
|
|
303
|
-
"2703": "Slovakia",
|
|
304
|
-
"2704": "Vietnam",
|
|
305
|
-
"2705": "Slovenia",
|
|
306
|
-
"2706": "Somalia",
|
|
307
|
-
"2710": "South Africa",
|
|
308
|
-
"2716": "Zimbabwe",
|
|
309
|
-
"2724": "Spain",
|
|
310
|
-
"2728": "South Sudan",
|
|
311
|
-
"2732": "Western Sahara",
|
|
312
|
-
"2736": "Sudan",
|
|
313
|
-
"2740": "Suriname",
|
|
314
|
-
"2744": "Svalbard and Jan Mayen",
|
|
315
|
-
"2748": "Eswatini",
|
|
316
|
-
"2752": "Sweden",
|
|
317
|
-
"2756": "Switzerland",
|
|
318
|
-
"2760": "Syria",
|
|
319
|
-
"2762": "Tajikistan",
|
|
320
|
-
"2764": "Thailand",
|
|
321
|
-
"2768": "Togo",
|
|
322
|
-
"2772": "Tokelau",
|
|
323
|
-
"2776": "Tonga",
|
|
324
|
-
"2780": "Trinidad and Tobago",
|
|
325
|
-
"2784": "United Arab Emirates",
|
|
326
|
-
"2788": "Tunisia",
|
|
327
|
-
"2792": "Turkiye",
|
|
328
|
-
"2795": "Turkmenistan",
|
|
329
|
-
"2796": "Turks and Caicos Islands",
|
|
330
|
-
"2798": "Tuvalu",
|
|
331
|
-
"2800": "Uganda",
|
|
332
|
-
"2804": "Ukraine",
|
|
333
|
-
"2807": "North Macedonia",
|
|
334
|
-
"2818": "Egypt",
|
|
335
|
-
"2826": "United Kingdom",
|
|
336
|
-
"2831": "Guernsey",
|
|
337
|
-
"2832": "Jersey",
|
|
338
|
-
"2833": "Isle of Man",
|
|
339
|
-
"2834": "Tanzania",
|
|
340
|
-
"2840": "United States",
|
|
341
|
-
"2850": "U.S. Virgin Islands",
|
|
342
|
-
"2854": "Burkina Faso",
|
|
343
|
-
"2858": "Uruguay",
|
|
344
|
-
"2860": "Uzbekistan",
|
|
345
|
-
"2862": "Venezuela",
|
|
346
|
-
"2876": "Wallis and Futuna",
|
|
347
|
-
"2882": "Samoa",
|
|
348
|
-
"2887": "Yemen",
|
|
349
|
-
"2894": "Zambia",
|
|
350
|
-
"2900": "Kosovo"
|
|
351
|
-
};
|
|
352
|
-
var LANGUAGE_CONSTANTS = {
|
|
353
|
-
"1000": "English",
|
|
354
|
-
"1001": "German",
|
|
355
|
-
"1002": "French",
|
|
356
|
-
"1003": "Spanish",
|
|
357
|
-
"1004": "Italian",
|
|
358
|
-
"1005": "Japanese",
|
|
359
|
-
"1009": "Danish",
|
|
360
|
-
"1010": "Dutch",
|
|
361
|
-
"1011": "Finnish",
|
|
362
|
-
"1012": "Korean",
|
|
363
|
-
"1013": "Norwegian",
|
|
364
|
-
"1014": "Portuguese",
|
|
365
|
-
"1015": "Swedish",
|
|
366
|
-
"1017": "Chinese (simplified)",
|
|
367
|
-
"1018": "Chinese (traditional)",
|
|
368
|
-
"1019": "Arabic",
|
|
369
|
-
"1020": "Bulgarian",
|
|
370
|
-
"1021": "Czech",
|
|
371
|
-
"1022": "Greek",
|
|
372
|
-
"1023": "Hindi",
|
|
373
|
-
"1024": "Hungarian",
|
|
374
|
-
"1025": "Indonesian",
|
|
375
|
-
"1026": "Icelandic",
|
|
376
|
-
"1027": "Hebrew",
|
|
377
|
-
"1028": "Latvian",
|
|
378
|
-
"1029": "Lithuanian",
|
|
379
|
-
"1030": "Polish",
|
|
380
|
-
"1031": "Russian",
|
|
381
|
-
"1032": "Romanian",
|
|
382
|
-
"1033": "Slovak",
|
|
383
|
-
"1034": "Slovenian",
|
|
384
|
-
"1035": "Serbian",
|
|
385
|
-
"1036": "Ukrainian",
|
|
386
|
-
"1037": "Turkish",
|
|
387
|
-
"1038": "Catalan",
|
|
388
|
-
"1039": "Croatian",
|
|
389
|
-
"1040": "Vietnamese",
|
|
390
|
-
"1041": "Urdu",
|
|
391
|
-
"1042": "Filipino",
|
|
392
|
-
"1043": "Estonian",
|
|
393
|
-
"1044": "Thai",
|
|
394
|
-
"1056": "Bengali",
|
|
395
|
-
"1064": "Persian",
|
|
396
|
-
"1072": "Gujarati",
|
|
397
|
-
"1086": "Kannada",
|
|
398
|
-
"1098": "Malayalam",
|
|
399
|
-
"1101": "Marathi",
|
|
400
|
-
"1102": "Malay",
|
|
401
|
-
"1110": "Punjabi",
|
|
402
|
-
"1130": "Tamil",
|
|
403
|
-
"1131": "Telugu"
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
export {
|
|
407
|
-
CHANGE_SCOPES,
|
|
408
|
-
CHANGE_SCOPE_MAX_DAYS,
|
|
409
|
-
DEFAULT_CHANGE_DAYS,
|
|
410
|
-
isChangeLookbackWithinReach,
|
|
411
|
-
GEO_TARGET_COUNTRIES,
|
|
412
|
-
LANGUAGE_CONSTANTS,
|
|
413
|
-
ACCOUNT_URL_OPTIONS_LOCATION,
|
|
414
|
-
ACCOUNT_URL_OPTIONS_NOT_STAGEABLE,
|
|
415
|
-
urlOptionsHints
|
|
416
|
-
};
|
|
417
|
-
//# sourceMappingURL=chunk-XCM6XWOB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../api/src/ads-google/change-history.ts","../../api/src/ads-google/url-options.ts","../../api/src/ads-google/geo-constants.ts"],"sourcesContent":["/**\n * How far back Google's account history actually reaches, shared by the CLI and the\n * backend so the two layers cannot disagree about the limit.\n *\n * `change_event` carries field-level detail — old → new value and the user who made the\n * change — for the last 30 days. `change_status` reaches 90 days but only reports which\n * resources were added, changed or removed. Past 90 days there is no API at all; the\n * change has to be inferred from performance, or read from the Google Ads web UI.\n */\n\nexport const CHANGE_SCOPES = [\"detail\", \"summary\"] as const;\n\nexport type ChangeScope = (typeof CHANGE_SCOPES)[number];\n\nexport const CHANGE_SCOPE_MAX_DAYS: Record<ChangeScope, number> = {\n detail: 30,\n summary: 90,\n};\n\nexport const DEFAULT_CHANGE_DAYS = 7;\n\n/** Longest lookback any history resource can serve. */\nexport const MAX_CHANGE_DAYS = CHANGE_SCOPE_MAX_DAYS.summary;\n\nexport function isChangeLookbackWithinReach(days: number, scope: ChangeScope): boolean {\n return days <= CHANGE_SCOPE_MAX_DAYS[scope];\n}\n\n/** The cheapest scope that can serve `days`, or null when nothing reaches that far. */\nexport function changeScopeForDays(days: number): ChangeScope | null {\n return CHANGE_SCOPES.find((scope) => isChangeLookbackWithinReach(days, scope)) ?? null;\n}\n\n/**\n * Why a lookback was refused, and what to do instead. Callers that bypass the CLI get\n * this straight from the API, so it has to carry the way out of the window rather than\n * just the limit that was breached.\n */\nexport function changeLookbackMessage(days: number, scope: ChangeScope): string {\n const reachable = changeScopeForDays(days);\n if (reachable && reachable !== scope) {\n return `Google keeps field-level change detail for ${CHANGE_SCOPE_MAX_DAYS.detail} days only, and ${days} days is outside that window. Use scope \"${reachable}\" to reach back ${CHANGE_SCOPE_MAX_DAYS[reachable]} days — it reports which resources changed, without the old and new values.`;\n }\n return `Google's account history reaches back ${MAX_CHANGE_DAYS} days at most, and ${days} days is outside that window. Infer the change from monthly spend per campaign instead; anything older with attribution exists only in the Google Ads web interface, which has no API.`;\n}\n","/**\n * `ads.google.url-options` — the URL/tracking options in force on an account.\n *\n * Google returns a field ONLY when it holds a value: an unset `final_url_suffix`\n * is not `\"\"`, it is a key that never appears in the row. Reported naively, that\n * is indistinguishable from a read that never happened — and a false \"no suffix\n * is configured\" has already been written into a client's knowledge base from\n * exactly that ambiguity.\n *\n * So every value here is a tagged union, never a bare string:\n *\n * - `{ state: \"set\", value }` — observed, holds this value\n * - `{ state: \"not_set\" }` — observed, Google carries no value at this level\n * - `{ state: \"not_read\", reason }` — never observed; says nothing about the account\n *\n * and every level Baker did NOT read is listed explicitly in `levels_not_read`\n * rather than silently omitted. Absence is only a finding when it is `not_set`.\n */\nimport { z } from \"zod\";\nimport { NUMERIC_ID_REGEX } from \"./limits\";\n\n/** Google resolves URL options most-specific-first; these are the levels that can carry one. */\nexport const URL_OPTION_LEVELS = [\"account\", \"campaign\", \"ad_group\", \"ad\"] as const;\nexport type GoogleUrlOptionLevel = (typeof URL_OPTION_LEVELS)[number];\n\nexport const googleUrlOptionValueSchema = z.discriminatedUnion(\"state\", [\n z.object({ state: z.literal(\"set\"), value: z.string() }),\n z.object({ state: z.literal(\"not_set\") }),\n z.object({ state: z.literal(\"not_read\"), reason: z.string() }),\n]);\nexport type GoogleUrlOptionValue = z.infer<typeof googleUrlOptionValueSchema>;\n\nexport const googleUrlOptionsRequestSchema = z.object({\n customerId: z.string().regex(NUMERIC_ID_REGEX, \"customerId must be the bare numeric customer id\"),\n managerId: z.string().optional(),\n /** Compact by default: only campaigns that actually override the account. `full` lists every campaign. */\n full: z.boolean().optional(),\n skipCache: z.boolean().optional(),\n});\nexport type GoogleUrlOptionsRequest = z.infer<typeof googleUrlOptionsRequestSchema>;\n\nexport const googleUrlOptionsCampaignSchema = z.object({\n id: z.string(),\n name: z.string(),\n status: z.string(),\n final_url_suffix: googleUrlOptionValueSchema,\n tracking_url_template: googleUrlOptionValueSchema,\n});\nexport type GoogleUrlOptionsCampaign = z.infer<typeof googleUrlOptionsCampaignSchema>;\n\nexport const googleUrlOptionsResponseSchema = z.object({\n customer_id: z.string(),\n account: z.object({\n level: z.literal(\"account\"),\n read: z.boolean(),\n final_url_suffix: googleUrlOptionValueSchema,\n tracking_url_template: googleUrlOptionValueSchema,\n }),\n campaigns: z.object({\n level: z.literal(\"campaign\"),\n read: z.boolean(),\n /** Campaigns actually observed. 0 with `read: true` means the account has no non-removed campaigns. */\n campaigns_read: z.number().int().nonnegative(),\n /** Campaigns observed to carry no override of their own — an explicit finding, not an omission. */\n campaigns_without_override: z.number().int().nonnegative(),\n overrides: z.array(googleUrlOptionsCampaignSchema),\n /** Compact mode only: campaigns read but not listed because they carry no override. */\n omitted: z.number().int().nonnegative(),\n }),\n /** Levels this command never queried. Nothing here may be reported as \"not configured\". */\n levels_not_read: z.array(z.object({ level: z.enum(URL_OPTION_LEVELS), reason: z.string() })),\n});\nexport type GoogleUrlOptionsResponse = z.infer<typeof googleUrlOptionsResponseSchema>;\n\n/** Where Google keeps the account-level fields, verbatim, for an agent relaying it to a marketer. */\nexport const ACCOUNT_URL_OPTIONS_LOCATION =\n \"Google Ads UI → Admin → Account settings → Tracking (account-level tracking template and final URL suffix)\";\n\n/**\n * Why Baker cannot stage the account-level value: `customer.final_url_suffix` is written by\n * `CustomerService.MutateCustomer`, a different service from the `GoogleAdsService.Mutate` batch\n * every staged Google op applies through, so it cannot ride the atomic publish.\n */\nexport const ACCOUNT_URL_OPTIONS_NOT_STAGEABLE =\n \"Account-level URL options are written by a different Google service than the one Baker's staged changes apply through, so they can't be staged or published from here.\";\n\nfunction isSet(value: GoogleUrlOptionValue): value is { state: \"set\"; value: string } {\n return value.state === \"set\";\n}\n\n/**\n * Post-read nudges. The account level is the right home for an account-wide parameter\n * (agency/partner tagging), so a missing account suffix is the finding worth surfacing —\n * and a level that failed to read must never be reported as unset.\n */\nexport function urlOptionsHints(report: GoogleUrlOptionsResponse): string[] {\n const hints: string[] = [];\n const { account, campaigns } = report;\n\n if (!account.read) {\n hints.push(\n \"The account level did NOT read — its URL options are unknown, not empty. Re-run before telling the user anything about account-wide tagging.\",\n );\n } else if (account.final_url_suffix.state === \"not_set\") {\n hints.push(\n `No account-level final URL suffix is set. An account-wide parameter (agency/partner tagging such as utm_agency=…) belongs at the account level so it reaches every ad — set it in ${ACCOUNT_URL_OPTIONS_LOCATION}. ${ACCOUNT_URL_OPTIONS_NOT_STAGEABLE}`,\n );\n }\n\n if (!campaigns.read) {\n hints.push(\n \"Campaign-level URL options did NOT read — do not report that no campaign overrides exist. Re-run before concluding.\",\n );\n } else {\n // `overrides` carries every campaign under --full, not just the overriding ones,\n // so name the ones that actually set a suffix. Saying \"campaigns listed under\n // `overrides`\" would tell the agent that campaigns inheriting fine are broken.\n const overriding = campaigns.overrides.filter((c) => isSet(c.final_url_suffix));\n if (overriding.length > 0) {\n const named = overriding\n .slice(0, 5)\n .map((c) => c.name || c.id)\n .join(\", \");\n hints.push(\n `A campaign's final URL suffix REPLACES the account-level one for that campaign — it does not merge. ${overriding.length} campaign(s) set their own (${named}${overriding.length > 5 ? \", …\" : \"\"}) and will not pick up an account-wide parameter until their own suffix carries it too. Every other campaign read here inherits the account level normally.`,\n );\n }\n }\n\n // Precedence is account → campaign → ad group → ad, most specific winning, so\n // \"a suffix set there still wins\" only holds for levels BELOW the ones that read.\n // `account` is the least specific — a campaign, ad-group or ad suffix overrides it —\n // and it joins `levels_not_read` whenever the customer read fails, which would hand\n // the agent the precedence backwards. Its own \"did NOT read\" hint above covers it.\n const overridingLevelsNotRead = report.levels_not_read.filter((level) => level.level !== \"account\");\n if (overridingLevelsNotRead.length > 0) {\n hints.push(\n `Not read at this level: ${overridingLevelsNotRead.map((l) => l.level).join(\", \")}. A suffix set there still wins over the levels above it.`,\n );\n }\n\n if (campaigns.omitted > 0) {\n hints.push(`${campaigns.omitted} campaign(s) read with no override of their own are not listed — pass --full.`);\n }\n\n return hints;\n}\n","/**\n * Google's country geo-target constants and language constants, id → display name.\n *\n * These ids are global and stable across accounts, so a staged location or language\n * criterion reads \"Poland\" / \"Polish\" on the review card without a live lookup. Both\n * lists are complete as published by Google — a partial list is what previously made\n * most of a multi-market campaign's targeting render as \"Location 2616\".\n *\n * Generated — refresh with `pnpm --filter @baker/api geo-constants`:\n * - countries: https://developers.google.com/google-ads/api/data/geotargets (246 active top-level targets)\n * - languages: https://developers.google.com/google-ads/api/data/codes-formats#languages (51 languages)\n *\n * \"Country\" here means every target Google lists with no parent — 219 typed Country plus the 27 it\n * types Region (Taiwan, Hong Kong, Puerto Rico, Kosovo, …), which are ordinary targeting choices.\n *\n * Sub-country targets (regions, cities, postal codes) number in the hundreds of thousands\n * and are resolved live at stage time instead — see `withConstantName` in stage.ts.\n */\n\nexport const GEO_TARGET_COUNTRIES: Record<string, string> = {\n \"2004\": \"Afghanistan\",\n \"2008\": \"Albania\",\n \"2010\": \"Antarctica\",\n \"2012\": \"Algeria\",\n \"2016\": \"American Samoa\",\n \"2020\": \"Andorra\",\n \"2024\": \"Angola\",\n \"2028\": \"Antigua and Barbuda\",\n \"2031\": \"Azerbaijan\",\n \"2032\": \"Argentina\",\n \"2036\": \"Australia\",\n \"2040\": \"Austria\",\n \"2044\": \"The Bahamas\",\n \"2048\": \"Bahrain\",\n \"2050\": \"Bangladesh\",\n \"2051\": \"Armenia\",\n \"2052\": \"Barbados\",\n \"2056\": \"Belgium\",\n \"2060\": \"Bermuda\",\n \"2064\": \"Bhutan\",\n \"2068\": \"Bolivia\",\n \"2070\": \"Bosnia and Herzegovina\",\n \"2072\": \"Botswana\",\n \"2074\": \"Bouvet Island\",\n \"2076\": \"Brazil\",\n \"2084\": \"Belize\",\n \"2086\": \"British Indian Ocean Territory\",\n \"2090\": \"Solomon Islands\",\n \"2092\": \"British Virgin Islands\",\n \"2096\": \"Brunei\",\n \"2100\": \"Bulgaria\",\n \"2104\": \"Myanmar (Burma)\",\n \"2108\": \"Burundi\",\n \"2112\": \"Belarus\",\n \"2116\": \"Cambodia\",\n \"2120\": \"Cameroon\",\n \"2124\": \"Canada\",\n \"2132\": \"Cabo Verde\",\n \"2136\": \"Cayman Islands\",\n \"2140\": \"Central African Republic\",\n \"2144\": \"Sri Lanka\",\n \"2148\": \"Chad\",\n \"2152\": \"Chile\",\n \"2156\": \"China\",\n \"2158\": \"Taiwan\",\n \"2162\": \"Christmas Island\",\n \"2166\": \"Cocos (Keeling) Islands\",\n \"2170\": \"Colombia\",\n \"2174\": \"Comoros\",\n \"2175\": \"Mayotte\",\n \"2178\": \"Republic of the Congo\",\n \"2180\": \"Democratic Republic of the Congo\",\n \"2184\": \"Cook Islands\",\n \"2188\": \"Costa Rica\",\n \"2191\": \"Croatia\",\n \"2196\": \"Cyprus\",\n \"2203\": \"Czechia\",\n \"2204\": \"Benin\",\n \"2208\": \"Denmark\",\n \"2212\": \"Dominica\",\n \"2214\": \"Dominican Republic\",\n \"2218\": \"Ecuador\",\n \"2222\": \"El Salvador\",\n \"2226\": \"Equatorial Guinea\",\n \"2231\": \"Ethiopia\",\n \"2232\": \"Eritrea\",\n \"2233\": \"Estonia\",\n \"2234\": \"Faroe Islands\",\n \"2238\": \"Falkland Islands (Islas Malvinas)\",\n \"2239\": \"South Georgia and the South Sandwich Islands\",\n \"2242\": \"Fiji\",\n \"2246\": \"Finland\",\n \"2250\": \"France\",\n \"2254\": \"French Guiana\",\n \"2258\": \"French Polynesia\",\n \"2260\": \"French Southern and Antarctic Lands\",\n \"2262\": \"Djibouti\",\n \"2266\": \"Gabon\",\n \"2268\": \"Georgia\",\n \"2270\": \"The Gambia\",\n \"2275\": \"Palestine\",\n \"2276\": \"Germany\",\n \"2288\": \"Ghana\",\n \"2292\": \"Gibraltar\",\n \"2296\": \"Kiribati\",\n \"2300\": \"Greece\",\n \"2304\": \"Greenland\",\n \"2308\": \"Grenada\",\n \"2312\": \"Guadeloupe\",\n \"2316\": \"Guam\",\n \"2320\": \"Guatemala\",\n \"2324\": \"Guinea\",\n \"2328\": \"Guyana\",\n \"2332\": \"Haiti\",\n \"2334\": \"Heard Island and McDonald Islands\",\n \"2336\": \"Vatican City\",\n \"2340\": \"Honduras\",\n \"2344\": \"Hong Kong\",\n \"2348\": \"Hungary\",\n \"2352\": \"Iceland\",\n \"2356\": \"India\",\n \"2360\": \"Indonesia\",\n \"2368\": \"Iraq\",\n \"2372\": \"Ireland\",\n \"2376\": \"Israel\",\n \"2380\": \"Italy\",\n \"2384\": \"Cote d'Ivoire\",\n \"2388\": \"Jamaica\",\n \"2392\": \"Japan\",\n \"2398\": \"Kazakhstan\",\n \"2400\": \"Jordan\",\n \"2404\": \"Kenya\",\n \"2410\": \"South Korea\",\n \"2414\": \"Kuwait\",\n \"2417\": \"Kyrgyzstan\",\n \"2418\": \"Laos\",\n \"2422\": \"Lebanon\",\n \"2426\": \"Lesotho\",\n \"2428\": \"Latvia\",\n \"2430\": \"Liberia\",\n \"2434\": \"Libya\",\n \"2438\": \"Liechtenstein\",\n \"2440\": \"Lithuania\",\n \"2442\": \"Luxembourg\",\n \"2446\": \"Macao\",\n \"2450\": \"Madagascar\",\n \"2454\": \"Malawi\",\n \"2458\": \"Malaysia\",\n \"2462\": \"Maldives\",\n \"2466\": \"Mali\",\n \"2470\": \"Malta\",\n \"2474\": \"Martinique\",\n \"2478\": \"Mauritania\",\n \"2480\": \"Mauritius\",\n \"2484\": \"Mexico\",\n \"2492\": \"Monaco\",\n \"2496\": \"Mongolia\",\n \"2498\": \"Moldova\",\n \"2499\": \"Montenegro\",\n \"2500\": \"Montserrat\",\n \"2504\": \"Morocco\",\n \"2508\": \"Mozambique\",\n \"2512\": \"Oman\",\n \"2516\": \"Namibia\",\n \"2520\": \"Nauru\",\n \"2524\": \"Nepal\",\n \"2528\": \"Netherlands\",\n \"2531\": \"Curacao\",\n \"2533\": \"Aruba\",\n \"2534\": \"Sint Maarten\",\n \"2535\": \"Caribbean Netherlands\",\n \"2540\": \"New Caledonia\",\n \"2548\": \"Vanuatu\",\n \"2554\": \"New Zealand\",\n \"2558\": \"Nicaragua\",\n \"2562\": \"Niger\",\n \"2566\": \"Nigeria\",\n \"2570\": \"Niue\",\n \"2574\": \"Norfolk Island\",\n \"2578\": \"Norway\",\n \"2580\": \"Northern Mariana Islands\",\n \"2581\": \"United States Minor Outlying Islands\",\n \"2583\": \"Micronesia\",\n \"2584\": \"Marshall Islands\",\n \"2585\": \"Palau\",\n \"2586\": \"Pakistan\",\n \"2591\": \"Panama\",\n \"2598\": \"Papua New Guinea\",\n \"2600\": \"Paraguay\",\n \"2604\": \"Peru\",\n \"2608\": \"Philippines\",\n \"2612\": \"Pitcairn Islands\",\n \"2616\": \"Poland\",\n \"2620\": \"Portugal\",\n \"2624\": \"Guinea-Bissau\",\n \"2626\": \"Timor-Leste\",\n \"2630\": \"Puerto Rico\",\n \"2634\": \"Qatar\",\n \"2638\": \"Reunion\",\n \"2642\": \"Romania\",\n \"2643\": \"Russia\",\n \"2646\": \"Rwanda\",\n \"2652\": \"Saint Barthelemy\",\n \"2654\": \"Saint Helena, Ascension and Tristan da Cunha\",\n \"2659\": \"Saint Kitts and Nevis\",\n \"2660\": \"Anguilla\",\n \"2662\": \"Saint Lucia\",\n \"2663\": \"Saint Martin\",\n \"2666\": \"Saint Pierre and Miquelon\",\n \"2670\": \"Saint Vincent and the Grenadines\",\n \"2674\": \"San Marino\",\n \"2678\": \"Sao Tome and Principe\",\n \"2682\": \"Saudi Arabia\",\n \"2686\": \"Senegal\",\n \"2688\": \"Serbia\",\n \"2690\": \"Seychelles\",\n \"2694\": \"Sierra Leone\",\n \"2702\": \"Singapore\",\n \"2703\": \"Slovakia\",\n \"2704\": \"Vietnam\",\n \"2705\": \"Slovenia\",\n \"2706\": \"Somalia\",\n \"2710\": \"South Africa\",\n \"2716\": \"Zimbabwe\",\n \"2724\": \"Spain\",\n \"2728\": \"South Sudan\",\n \"2732\": \"Western Sahara\",\n \"2736\": \"Sudan\",\n \"2740\": \"Suriname\",\n \"2744\": \"Svalbard and Jan Mayen\",\n \"2748\": \"Eswatini\",\n \"2752\": \"Sweden\",\n \"2756\": \"Switzerland\",\n \"2760\": \"Syria\",\n \"2762\": \"Tajikistan\",\n \"2764\": \"Thailand\",\n \"2768\": \"Togo\",\n \"2772\": \"Tokelau\",\n \"2776\": \"Tonga\",\n \"2780\": \"Trinidad and Tobago\",\n \"2784\": \"United Arab Emirates\",\n \"2788\": \"Tunisia\",\n \"2792\": \"Turkiye\",\n \"2795\": \"Turkmenistan\",\n \"2796\": \"Turks and Caicos Islands\",\n \"2798\": \"Tuvalu\",\n \"2800\": \"Uganda\",\n \"2804\": \"Ukraine\",\n \"2807\": \"North Macedonia\",\n \"2818\": \"Egypt\",\n \"2826\": \"United Kingdom\",\n \"2831\": \"Guernsey\",\n \"2832\": \"Jersey\",\n \"2833\": \"Isle of Man\",\n \"2834\": \"Tanzania\",\n \"2840\": \"United States\",\n \"2850\": \"U.S. Virgin Islands\",\n \"2854\": \"Burkina Faso\",\n \"2858\": \"Uruguay\",\n \"2860\": \"Uzbekistan\",\n \"2862\": \"Venezuela\",\n \"2876\": \"Wallis and Futuna\",\n \"2882\": \"Samoa\",\n \"2887\": \"Yemen\",\n \"2894\": \"Zambia\",\n \"2900\": \"Kosovo\",\n};\n\nexport const LANGUAGE_CONSTANTS: Record<string, string> = {\n \"1000\": \"English\",\n \"1001\": \"German\",\n \"1002\": \"French\",\n \"1003\": \"Spanish\",\n \"1004\": \"Italian\",\n \"1005\": \"Japanese\",\n \"1009\": \"Danish\",\n \"1010\": \"Dutch\",\n \"1011\": \"Finnish\",\n \"1012\": \"Korean\",\n \"1013\": \"Norwegian\",\n \"1014\": \"Portuguese\",\n \"1015\": \"Swedish\",\n \"1017\": \"Chinese (simplified)\",\n \"1018\": \"Chinese (traditional)\",\n \"1019\": \"Arabic\",\n \"1020\": \"Bulgarian\",\n \"1021\": \"Czech\",\n \"1022\": \"Greek\",\n \"1023\": \"Hindi\",\n \"1024\": \"Hungarian\",\n \"1025\": \"Indonesian\",\n \"1026\": \"Icelandic\",\n \"1027\": \"Hebrew\",\n \"1028\": \"Latvian\",\n \"1029\": \"Lithuanian\",\n \"1030\": \"Polish\",\n \"1031\": \"Russian\",\n \"1032\": \"Romanian\",\n \"1033\": \"Slovak\",\n \"1034\": \"Slovenian\",\n \"1035\": \"Serbian\",\n \"1036\": \"Ukrainian\",\n \"1037\": \"Turkish\",\n \"1038\": \"Catalan\",\n \"1039\": \"Croatian\",\n \"1040\": \"Vietnamese\",\n \"1041\": \"Urdu\",\n \"1042\": \"Filipino\",\n \"1043\": \"Estonian\",\n \"1044\": \"Thai\",\n \"1056\": \"Bengali\",\n \"1064\": \"Persian\",\n \"1072\": \"Gujarati\",\n \"1086\": \"Kannada\",\n \"1098\": \"Malayalam\",\n \"1101\": \"Marathi\",\n \"1102\": \"Malay\",\n \"1110\": \"Punjabi\",\n \"1130\": \"Tamil\",\n \"1131\": \"Telugu\",\n};\n"],"mappings":"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O;AACT;;;AC/HO,IAAM,uBAA+C;AAAA,EAC1D,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,IAAM,qBAA6C;AAAA,EACxD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../api/src/capabilities/surfaces.ts","../../api/src/capabilities/index.ts"],"sourcesContent":["/**\n * The marketing surfaces Baker can reach, and — the part that exists nowhere\n * else — what it cannot do on each of them.\n *\n * Every other introspection surface (`baker schema <cmd>`, the family docs)\n * describes what the agent CAN do. An agent that needs to know a capability is\n * absent has, until now, only been able to find out by trying: promising a GA4\n * property merge and then discovering the connection is read-only, or probing\n * four spellings of a conversion-action field that does not exist. Both cost a\n * retraction in front of a client.\n *\n * This module is deliberately thin on prose and heavy on `evidence`. A\n * hand-maintained \"cannot do\" list rots the same way the Tag Manager built-in\n * trigger whitelist in this repo rotted down to one entry, so each limit carries\n * a machine-checkable claim about the code that makes it true, and\n * `packages/backend/convex/capabilities/coverage.test.ts` fails when a claim\n * stops holding — when the scope is finally requested, when the op ships, when\n * the guard is renamed away. `asserted` is the escape hatch for the handful of\n * facts that live outside this repo entirely, and it has to say why.\n */\n\nexport const CAPABILITY_SURFACES = [\n \"google-ads\",\n \"meta-ads\",\n \"linkedin-ads\",\n \"x-ads\",\n \"chatgpt-ads\",\n \"tag-manager\",\n \"ga4\",\n \"gsc\",\n] as const;\nexport type CapabilitySurfaceId = (typeof CAPABILITY_SURFACES)[number];\n\n/**\n * How a change on this surface reaches the outside world.\n * - `staged-live` — staged during the chat and applied against the real\n * ad account at publish. The per-company write flags\n * that could once make this simulated are retired, so\n * a completed chat spends the client's money.\n * - `staged-immediate` — staged during the chat and applied at publish for\n * real, every time. Tag Manager: completing the chat\n * changes the user's production container.\n * - `read-only` — nothing here writes.\n *\n * The first two split on consequence, not on certainty: both always apply, but\n * one costs ad spend and the other cuts a container version, and the agent has\n * to tell the user which.\n */\nexport type CapabilityWritePath = \"staged-live\" | \"staged-immediate\" | \"read-only\";\n\nexport interface CapabilitySurfaceSpec {\n id: CapabilitySurfaceId;\n /** How the user names it. */\n label: string;\n /** The `oauthProviders.type` this surface connects through; `chatgpt-ads` connects with a pasted key instead. */\n provider: string;\n /** What the user picks when connecting: \"ad account\", \"property\", \"container\". */\n resourceNoun: string;\n writePath: CapabilityWritePath;\n /**\n * OAuth scopes that would grant writes. Access is derived by intersecting these\n * with the scopes the app actually requests — which is why \"GA4 is read-only\"\n * is a fact about the connection, not a sentence someone typed.\n */\n writeScopes: string[];\n /** Where to look next on this surface. */\n commands: string;\n /**\n * How the company connects. Absent is an OAuth grant, whose scopes decide\n * access. `api-key` is a pasted key that reaches one account whole, so the\n * write path alone decides it.\n */\n connectsWith?: \"api-key\";\n}\n\nexport const CAPABILITY_SURFACE_SPECS: Readonly<Record<CapabilitySurfaceId, CapabilitySurfaceSpec>> = {\n \"google-ads\": {\n id: \"google-ads\",\n label: \"Google Ads\",\n provider: \"google-ads\",\n resourceNoun: \"ad account\",\n writePath: \"staged-live\",\n writeScopes: [\"https://www.googleapis.com/auth/adwords\"],\n commands: \"baker ads google\",\n },\n \"meta-ads\": {\n id: \"meta-ads\",\n label: \"Meta Ads\",\n provider: \"meta\",\n resourceNoun: \"ad account\",\n writePath: \"staged-live\",\n writeScopes: [\"ads_management\"],\n commands: \"baker ads meta\",\n },\n \"linkedin-ads\": {\n id: \"linkedin-ads\",\n label: \"LinkedIn Ads\",\n provider: \"linkedin\",\n resourceNoun: \"ad account\",\n writePath: \"staged-live\",\n writeScopes: [\"rw_ads\"],\n commands: \"baker ads linkedin\",\n },\n \"x-ads\": {\n id: \"x-ads\",\n label: \"X Ads\",\n provider: \"x-ads\",\n resourceNoun: \"ad account\",\n writePath: \"staged-live\",\n /**\n * Empty on purpose, and the one surface where that does NOT mean read-only.\n * X Ads authenticates with OAuth 1.0a, which has no scope strings at all —\n * write access is granted to the *app* by X's Ads API access review, not\n * per connection. There is therefore no scope to check, and inventing one\n * would make `scopeBlockers` refuse every X write for a permission that\n * does not exist.\n */\n writeScopes: [],\n commands: \"baker ads x\",\n },\n \"chatgpt-ads\": {\n id: \"chatgpt-ads\",\n label: \"ChatGPT Ads\",\n // Connected with the client's own Ads API key (`chatgptAdsConnections`), not an OAuth grant.\n provider: \"chatgpt-ads\",\n resourceNoun: \"ad account\",\n writePath: \"staged-live\",\n /**\n * Empty because the pasted key has no scopes: it reaches its one account\n * whole. When OpenAI approves Baker's OAuth app this becomes\n * `ads.admin.all.write` and `connectsWith` goes away.\n */\n writeScopes: [],\n commands: \"baker ads chatgpt\",\n connectsWith: \"api-key\",\n },\n \"tag-manager\": {\n id: \"tag-manager\",\n label: \"Tag Manager\",\n provider: \"google-tag-manager\",\n resourceNoun: \"container\",\n writePath: \"staged-immediate\",\n writeScopes: [\n \"https://www.googleapis.com/auth/tagmanager.edit.containers\",\n \"https://www.googleapis.com/auth/tagmanager.edit.containerversions\",\n \"https://www.googleapis.com/auth/tagmanager.publish\",\n ],\n commands: \"baker tag-manager\",\n },\n ga4: {\n id: \"ga4\",\n label: \"Google Analytics 4\",\n provider: \"google-analytics\",\n resourceNoun: \"property\",\n // Like Tag Manager: staged during the chat, applied for real at publish,\n // every time. A connection made before writes existed is\n // read-only until it is reconnected, and `access` does NOT say so — it\n // reports what the Baker app asks Google for, which is now app-wide\n // read-write. The per-company signal is `scopeBlockers`, which compares\n // `writeScopes` against the scopes that connection actually recorded.\n writePath: \"staged-immediate\",\n writeScopes: [\"https://www.googleapis.com/auth/analytics.edit\"],\n commands: \"baker ga4\",\n },\n gsc: {\n id: \"gsc\",\n label: \"Search Console\",\n provider: \"google-search-console\",\n resourceNoun: \"site\",\n writePath: \"read-only\",\n writeScopes: [\"https://www.googleapis.com/auth/webmasters\"],\n commands: \"baker gsc\",\n },\n};\n\n/**\n * Why a capability is missing. The distinction is what decides what the agent\n * tells the user, so it is part of the contract rather than left to prose:\n * - `not_built` — the platform allows it, Baker has not built it. It may\n * be possible by hand in the platform's own interface.\n * - `provider_forbids` — the platform rejects it however it is asked. Nobody can\n * do it, so do not hand the user a manual route.\n * - `no_permission` — the connection was never granted the access. Reading\n * works, changing does not; it is manual work today.\n */\nexport type CapabilityLimitCause = \"not_built\" | \"provider_forbids\" | \"no_permission\";\n\n/**\n * The checkable claim behind a limit. `coverage.test.ts` re-derives each one.\n */\nexport type CapabilityLimitEvidence =\n /** The app never requests this OAuth scope, so nothing can write here. */\n | { kind: \"scope\"; scope: string }\n /** No staged op with these kinds exists, so there is nothing to stage. */\n | { kind: \"noOpKind\"; kinds: string[] }\n /** A field on a staged op does not accept this value. */\n | { kind: \"noChoice\"; opKind: string; field: string; value: string }\n /** A stage-time guard refuses it before anything is spent. */\n | { kind: \"guard\"; module: string; symbol: string }\n /** Nothing in this repository encodes it; the note says why. */\n | { kind: \"asserted\"; note: string };\n\nexport interface CapabilityLimit {\n surface: CapabilitySurfaceId;\n /** What an agent would set out to do, in the words it would use. */\n capability: string;\n cause: CapabilityLimitCause;\n /** Why it cannot happen and what to do instead. Agent-facing, plain English. */\n detail: string;\n evidence: CapabilityLimitEvidence;\n}\n\n/**\n * Ordered by how often getting it wrong has cost something. Keep entries to\n * things an agent would plausibly promise a client before checking.\n */\nexport const CAPABILITY_LIMITS: readonly CapabilityLimit[] = [\n {\n surface: \"ga4\",\n capability:\n \"Create, merge or delete a property; add or edit a data stream; change the property's time zone or currency\",\n cause: \"not_built\",\n detail:\n \"Baker configures what a property MEASURES — key events, custom dimensions and metrics, custom events, audiences, the data retention window — plus the property's name, industry category and Google Ads link. It does not create or merge properties or touch data streams. Time zone and currency are deliberately excluded even though the API allows them: both change how every future day is bucketed without reprocessing history, so a correction puts a step in the middle of every time series the user compares against. Tell the user exactly what to change in the Google Analytics admin screens and carry on with the rest of the job.\",\n evidence: {\n kind: \"noOpKind\",\n kinds: [\"ga4.dataStream.create\", \"ga4.dataStream.update\", \"ga4.property.create\"],\n },\n },\n {\n surface: \"ga4\",\n capability: \"Change who is already in an audience, or build one from a sequence of steps\",\n cause: \"provider_forbids\",\n detail:\n \"An audience can be CREATED and ARCHIVED here, and its name and description changed. Everything that defines who is in it — the conditions, the membership window, the exclusion mode — is marked Immutable by Google and cannot be edited on an audience that exists, however it is asked. Fixing a definition therefore means archiving the audience and creating a replacement, which does NOT carry the users the first one gathered. Say that before staging the archive. Sequence-based audiences (`sequenceFilter`) are not offered: they are the easiest shape in this API to get subtly wrong and the mistake is permanent, so build them by hand in Google Analytics if one is genuinely needed.\",\n evidence: {\n kind: \"asserted\",\n note: \"The immutability is Google's, declared in the Admin API v1alpha `Audience` resource (`filter_clauses`, `membership_duration_days` and `exclusion_duration_mode` are all marked Immutable) — no code in this repository can be read to confirm a rule the provider enforces. What this repo does hold is the consequence: `GA4_IMMUTABLE_FIELDS.audience` in `packages/api/src/ga4/ops.ts` drives the refusal, and `ga4.test.ts` pins that an update carrying one of those fields is rejected with the archive-and-recreate wording rather than a zod key error.\",\n },\n },\n {\n surface: \"ga4\",\n capability: \"Try a Google Analytics configuration change without it taking effect\",\n cause: \"not_built\",\n detail:\n \"Google Analytics changes always apply to the real property: staged changes apply when the chat completes, and an applied change is in effect immediately — there is no version to publish afterwards and no undo. The user reviewing the Analytics tab and completing the chat is the review, so agree the changes with them before you complete it.\",\n evidence: {\n kind: \"asserted\",\n note: \"An absence: the GA4 executor has no simulated branch and GA4 drafts have no `mode` column, and no test can assert the absence of a mode that was never modelled. The nearest positive check is that the three ad surfaces do carry one — a `mode` column on their drafts and an `executeSimulated` branch in each executor — which the `staged-live` vs `staged-immediate` write paths already encode. Their per-company write gates are retired, so every ad draft is stamped `live`; the branch survives only for drafts published while the gates existed.\",\n },\n },\n {\n surface: \"gsc\",\n capability:\n \"Change anything in Search Console — add or verify a property, submit or delete a sitemap, set a preferred domain\",\n cause: \"no_permission\",\n detail:\n \"Baker's Search Console connection is read-only (webmasters.readonly). `baker gsc sitemaps` lists what is already submitted; it cannot submit one. Hand submission to the user in Search Console and carry on.\",\n evidence: { kind: \"scope\", scope: \"https://www.googleapis.com/auth/webmasters\" },\n },\n {\n surface: \"x-ads\",\n capability: \"Change anything in X Ads — create or edit campaigns, line items, or promoted posts\",\n cause: \"not_built\",\n detail:\n \"X Ads is a read-only surface in Baker: there are no staged write ops for it, so nothing can be staged and nothing publishes. Report on it freely; route any change to the user in X Ads Manager.\",\n evidence: { kind: \"noOpKind\", kinds: [\"x.campaign.create\", \"x.campaign.update\", \"x.lineItem.create\"] },\n },\n {\n surface: \"google-ads\",\n capability:\n \"Change a conversion action that Google itself created — Smart campaign calls and directions, the in-ad lead form's submit, YouTube subscriptions and follow-on views, Floodlight and Search Ads 360 imports, store visits, codeless webpage actions\",\n cause: \"provider_forbids\",\n detail:\n \"Google rejects every write against one of its own conversion actions, a rename as flatly as a removal. Baker refuses these at stage time so no publish is spent on them. There is no manual route either — the Google Ads interface will not change them — so do not hand the user one. Leave the action alone and say so.\",\n evidence: {\n module: \"ads/google/writes/conversionSafety.ts\",\n kind: \"guard\",\n symbol: \"googleOwnedConversionRefusal\",\n },\n },\n {\n surface: \"google-ads\",\n capability:\n \"Switch a demographic dimension — age, gender, parental status, household income — between Targeting and Observation\",\n cause: \"not_built\",\n detail:\n \"`baker ads google audiences targeting` sets the AUDIENCE dimension only. The demographic rows are read before every write and sent back exactly as they were, so nothing is lost — but changing one is manual work in the Google Ads interface. Say which one to change and where, and carry on with the rest of the job.\",\n evidence: { kind: \"noChoice\", opKind: \"google.targetingSetting.set\", field: \"audience\", value: \"AGE_RANGE\" },\n },\n {\n surface: \"google-ads\",\n capability: \"Hide a conversion action (status HIDDEN)\",\n cause: \"provider_forbids\",\n detail:\n 'Google denies HIDDEN on every conversion-action write (\"the field\\'s value is on a deny-list for this field\"), so it is not part of the write contract — even though actions hidden long ago still read back as HIDDEN. To take an action out of automated bidding while it keeps measuring, demote it: `baker ads google conversions update <id> --no-primary`. To stop it counting, set status REMOVED.',\n evidence: { kind: \"noChoice\", opKind: \"google.conversionAction.update\", field: \"status\", value: \"HIDDEN\" },\n },\n {\n surface: \"google-ads\",\n capability: \"Remove a device setting from a campaign once it has one\",\n cause: \"provider_forbids\",\n detail:\n \"A device criterion can be added with `campaign-criteria add` and re-bid afterwards, but Google rejects every removal of one — including a criterion the same account created itself days earlier (observed). So the undo for a bid boost is NOT a removal: it is `baker ads google campaign-criteria update <criterion-resource-name> --bid-modifier 1`, where 0 stops ads serving on that device and 0.1–10.0 bid down or up. Read `campaign_criterion.resource_name` and `campaign_criterion.bid_modifier` (type = DEVICE) first to see which devices the campaign already has. Baker refuses a staged device removal before publish; don't abort the job over it.\",\n evidence: {\n kind: \"guard\",\n module: \"ads/google/writes/stage.ts\",\n symbol: \"deviceCriterionRemovalRefusal\",\n },\n },\n {\n surface: \"google-ads\",\n capability: \"Change account settings, billing, payment methods, or account-level spend limits\",\n cause: \"not_built\",\n detail:\n \"Nothing that touches money setup is stageable — no op exists for it. Report on spend, then hand billing changes to the user in Google Ads.\",\n evidence: {\n kind: \"noOpKind\",\n kinds: [\"google.account.update\", \"google.billingSetup.create\", \"google.accountBudget.create\"],\n },\n },\n {\n surface: \"meta-ads\",\n capability:\n \"Push delivery to an ad — dedicate a share of the campaign or ad-set budget to one ad for a set number of days\",\n cause: \"not_built\",\n detail:\n 'Meta ships push delivery as an Ads Manager control only: the Marketing API\\'s ad object takes a schedule, a display sequence and tracking, and nothing that dedicates budget to one ad. So nothing can stage it and no publish can apply it — do not offer to switch it on, and never report a starved ad as pushed. Hand the user the click path and the settings you are recommending: Ad level > Ad setup > \"show more settings\" (next to ad scheduling) > \"Help ensure delivery by dedicating a portion of your budget to your ad\", then the percentage of budget and the number of days, for the one ad you name. It needs at least 2 ads in the ad set, and only one ad per ad set should be pushed. Then carry on with the rest of the job.',\n evidence: { kind: \"noOpKind\", kinds: [\"ad.pushDelivery\"] },\n },\n {\n surface: \"linkedin-ads\",\n capability: \"Move a live ad to another ad set, or change a live ad set's type, locale, or associated organization\",\n cause: \"provider_forbids\",\n detail:\n \"LinkedIn treats these as create-only: they can be corrected while the change is still staged, but not on something already live. Baker refuses the amend rather than staging a write LinkedIn will reject. Create the replacement instead, and say why.\",\n evidence: { kind: \"guard\", module: \"ads/linkedin/writes/amend.ts\", symbol: \"rejectedLiveKeys\" },\n },\n {\n surface: \"linkedin-ads\",\n capability: \"Use a video from the Baker media library, or a document, as LinkedIn ad creative\",\n cause: \"not_built\",\n detail:\n \"Only images upload to LinkedIn today; video and document creative are not built. Stage an image creative, or tell the user to upload the video in Campaign Manager, and carry on with the rest of the job.\",\n evidence: {\n kind: \"asserted\",\n note: \"Enforced by a throw inside the LinkedIn media uploader (ads/linkedin/writes/media.ts), not by the shared op contract — the op kind exists and accepts the reference, so no schema or op-kind check can see it.\",\n },\n },\n {\n surface: \"tag-manager\",\n capability: \"Create, delete, or move a Tag Manager account, container, or workspace\",\n cause: \"not_built\",\n detail:\n \"Baker works inside the containers the company connected — it changes tags, triggers, variables, folders, built-in variables and container settings, and nothing above that level. Ask the user to create the container in Tag Manager and connect it, then carry on.\",\n evidence: {\n kind: \"noOpKind\",\n kinds: [\n \"tagManager.container.create\",\n \"tagManager.container.delete\",\n \"tagManager.account.create\",\n \"tagManager.workspace.create\",\n ],\n },\n },\n {\n surface: \"tag-manager\",\n capability: \"Try a container change without it going live\",\n cause: \"not_built\",\n detail:\n \"Tag Manager changes always apply to the real container: staged changes apply to its working workspace when the chat completes, and a clean run cuts and publishes a container version, which takes them live on the site. Completing the chat is the review, so get the user's agreement before you complete it.\",\n evidence: {\n kind: \"asserted\",\n note: \"An absence: the Tag Manager executor has no simulated branch and its drafts have no `mode` column, and no test can assert the absence of a mode that was never modelled. The nearest positive check is that the three ad surfaces do carry one — a `mode` column on their drafts and an `executeSimulated` branch in each executor — which the `staged-live` vs `staged-immediate` write paths already encode. Their per-company write gates are retired, so every ad draft is stamped `live`; the branch survives only for drafts published while the gates existed.\",\n },\n },\n];\n","/**\n * Contract for `/api/capabilities` — what Baker can and cannot do for this\n * company, answered before any work starts (`baker capabilities`).\n *\n * Convex `Id<T>` values are plain `z.string()`; this package must not depend on\n * `convex`. Nothing here carries a token, key, or anything a credential could be\n * reconstructed from — the response names accounts and permissions, never\n * secrets.\n */\nimport { z } from \"zod\";\nimport { CAPABILITY_SURFACES } from \"./surfaces\";\n\nexport { describeOpUnion, type OpDescription } from \"./op-fields\";\nexport {\n CAPABILITY_LIMITS,\n CAPABILITY_SURFACE_SPECS,\n CAPABILITY_SURFACES,\n type CapabilityLimit,\n type CapabilityLimitCause,\n type CapabilityLimitEvidence,\n type CapabilitySurfaceId,\n type CapabilitySurfaceSpec,\n type CapabilityWritePath,\n} from \"./surfaces\";\n\nexport const capabilitySurfaceSchema = z.enum(CAPABILITY_SURFACES);\n\nexport const capabilitiesRequestSchema = z.object({\n /** Narrow to one surface. Omit for every surface the company could use. */\n surface: capabilitySurfaceSchema.optional(),\n /** Include the field-level contract of every op, not just the entity list. */\n full: z.boolean().optional(),\n /**\n * Who the chat acts as (`BAKER_ACTING_USER_ID`). Adds that person's own\n * connected tools — they load for this turn, and for nobody else's.\n */\n actingUserId: z.string().optional(),\n});\nexport type CapabilitiesRequest = z.infer<typeof capabilitiesRequestSchema>;\n\n/** A connected account, property, site or container. Identity only. */\nexport const capabilityResourceSchema = z.object({\n id: z.string(),\n name: z.string().optional(),\n});\nexport type CapabilityResource = z.infer<typeof capabilityResourceSchema>;\n\nexport const capabilityOpSchema = z.object({\n kind: z.string(),\n /** True when the op changes something that already exists and must be named. */\n needsTarget: z.boolean(),\n required: z.array(z.string()),\n optional: z.array(z.string()),\n /** Field → the values it accepts, for fields that take a fixed set. */\n choices: z.record(z.string(), z.array(z.string())),\n /** False when the platform accepts fields beyond the listed ones. */\n fieldsAreComplete: z.boolean(),\n});\nexport type CapabilityOp = z.infer<typeof capabilityOpSchema>;\n\nexport const capabilityLimitViewSchema = z.object({\n capability: z.string(),\n cause: z.enum([\"not_built\", \"provider_forbids\", \"no_permission\"]),\n detail: z.string(),\n});\nexport type CapabilityLimitView = z.infer<typeof capabilityLimitViewSchema>;\n\n/**\n * `live` — writes reach the real platform at publish.\n * `applies-at-publish` — publishing changes the real thing, with no version step after.\n * `none` — this surface does not write.\n *\n * There is no `simulated`: the per-company gates that produced it on Google,\n * Meta and LinkedIn are all retired, so no surface can report a write that\n * touches nothing. Leaving the value in the contract would keep alive the one\n * sentence this report exists to prevent — \"your ads are only a preview\".\n */\nexport const capabilityWriteModeSchema = z.enum([\"live\", \"applies-at-publish\", \"none\"]);\nexport type CapabilityWriteMode = z.infer<typeof capabilityWriteModeSchema>;\n\nexport const capabilitySurfaceReportSchema = z.object({\n surface: capabilitySurfaceSchema,\n label: z.string(),\n connected: z.boolean(),\n /** What the user picked when connecting. Empty when nothing is selected yet. */\n resources: z.array(capabilityResourceSchema),\n access: z.enum([\"read-write\", \"read-only\", \"not-connected\"]),\n writeMode: capabilityWriteModeSchema,\n /** One sentence about the write mode, safe to repeat to the user. */\n writeModeNote: z.string(),\n /** Entities this surface can change at all, e.g. \"campaign\", \"keyword\". */\n writableEntities: z.array(z.string()),\n /** Things wrong with the connection itself: needs reconnecting, missing a permission. */\n blockers: z.array(z.string()),\n /** What cannot be done here, and why. */\n limits: z.array(capabilityLimitViewSchema),\n /** The per-op contract. Present when one surface was asked for, or with `full`. */\n ops: z.array(capabilityOpSchema).optional(),\n /** Where to look next: `baker ads google`, `baker ga4`, … */\n commands: z.string(),\n});\nexport type CapabilitySurfaceReport = z.infer<typeof capabilitySurfaceReportSchema>;\n\n/**\n * A source that is available to this company but is not one of the seven\n * marketing surfaces above.\n *\n * These exist because \"what do I have?\" had no single answer, and the gap was\n * not academic: Microsoft Clarity arrives over MCP and HubSpot is read through\n * the CLI, so neither appears in `surfaces` — and an agent that checked only\n * this command concluded it had no Clarity while Clarity was sitting in its own\n * tool list. That is the source most likely to change what it decides.\n *\n * Deliberately NOT modelled as a surface. A surface carries `ops`,\n * `writableEntities` and a write mode, all of which describe a staged-write\n * contract Baker owns. An MCP toolkit has none of that — Baker did not define\n * its tools and cannot enumerate their fields — so filing one under `surfaces`\n * would mean either lying about the contract or leaving four fields empty on\n * every row and inviting the reader to wonder which.\n */\nexport const capabilityToolSchema = z.object({\n /** `microsoft_clarity`, `hubspot`, or the name the user gave a custom server. */\n key: z.string(),\n label: z.string(),\n /** `mcp` — tools in the agent's own list. `platform` — signed in, read through the CLI. */\n kind: z.enum([\"mcp\", \"platform\"]),\n /** How to actually reach it, in one phrase the agent can act on. */\n reach: z.string(),\n /**\n * Whether it can be used right now.\n *\n * A connection that exists and is expired is worse than one that is absent:\n * it reads as available and fails at the moment it is needed, which on an\n * unattended run is a report with a hole in it and no explanation.\n */\n ready: z.boolean(),\n /** Why it is not ready, or what it is for. Absent when neither needs saying. */\n note: z.string().optional(),\n});\nexport type CapabilityTool = z.infer<typeof capabilityToolSchema>;\n\nexport const capabilitiesResponseSchema = z.object({\n ok: z.literal(true),\n data: z.object({\n surfaces: z.array(capabilitySurfaceReportSchema),\n /**\n * Everything else this company can reach. Shared connections only —\n * a teammate's private per-user connection belongs to whoever started the\n * session and is visible in the agent's own tool list, not here.\n */\n tools: z.array(capabilityToolSchema),\n }),\n});\nexport type CapabilitiesResponse = z.infer<typeof capabilitiesResponseSchema>;\n"],"mappings":"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","names":[]}
|