@koda-sl/baker-cli 0.173.0 → 0.174.0-dev.04aff5532

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/dist/cli.js CHANGED
@@ -36,7 +36,7 @@ import {
36
36
  toModelSafeImage,
37
37
  ulid,
38
38
  validateCanvasDeep
39
- } from "./chunk-CG6OTNUU.js";
39
+ } from "./chunk-K424D3CY.js";
40
40
  import {
41
41
  csvOrJson,
42
42
  daysAgoIso,
@@ -45,7 +45,7 @@ import {
45
45
  resolveAccountIdArg,
46
46
  resolveEffectiveStatus,
47
47
  todayIso
48
- } from "./chunk-JOPBGFXC.js";
48
+ } from "./chunk-7QMWNMRW.js";
49
49
  import {
50
50
  buildQueryCacheKey,
51
51
  cacheGet,
@@ -55,18 +55,19 @@ import {
55
55
  getQueryTtl,
56
56
  handleConnectionError,
57
57
  isNotConnectedError,
58
+ needsConnectionFix,
58
59
  resolveCustomerId,
59
60
  toCsvRow,
60
61
  writeAdsJson,
61
62
  writeAdsOutput,
62
63
  writeJsonEnvelope
63
- } from "./chunk-R4PG6VCS.js";
64
+ } from "./chunk-TFPZLUVM.js";
64
65
  import {
65
66
  ApiError,
66
67
  apiGet,
67
68
  apiPost,
68
69
  validateConvexId
69
- } from "./chunk-LVCBCJWF.js";
70
+ } from "./chunk-ZH6ZNYPB.js";
70
71
  import {
71
72
  installStreamTaps,
72
73
  logInvocation
@@ -4601,7 +4602,7 @@ function accountHints(accounts) {
4601
4602
  }
4602
4603
  function handleAccountsError(err) {
4603
4604
  if (err instanceof ApiError) {
4604
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
4605
+ if (needsConnectionFix(err.code, err.message)) {
4605
4606
  handleConnectionError("google_ads", err.message);
4606
4607
  }
4607
4608
  const envelope = {
@@ -4781,6 +4782,309 @@ function isChangeLookbackWithinReach(days, scope) {
4781
4782
  return days <= CHANGE_SCOPE_MAX_DAYS[scope];
4782
4783
  }
4783
4784
 
4785
+ // ../api/src/ads-google/geo-constants.ts
4786
+ var GEO_TARGET_COUNTRIES = {
4787
+ "2004": "Afghanistan",
4788
+ "2008": "Albania",
4789
+ "2010": "Antarctica",
4790
+ "2012": "Algeria",
4791
+ "2016": "American Samoa",
4792
+ "2020": "Andorra",
4793
+ "2024": "Angola",
4794
+ "2028": "Antigua and Barbuda",
4795
+ "2031": "Azerbaijan",
4796
+ "2032": "Argentina",
4797
+ "2036": "Australia",
4798
+ "2040": "Austria",
4799
+ "2044": "The Bahamas",
4800
+ "2048": "Bahrain",
4801
+ "2050": "Bangladesh",
4802
+ "2051": "Armenia",
4803
+ "2052": "Barbados",
4804
+ "2056": "Belgium",
4805
+ "2060": "Bermuda",
4806
+ "2064": "Bhutan",
4807
+ "2068": "Bolivia",
4808
+ "2070": "Bosnia and Herzegovina",
4809
+ "2072": "Botswana",
4810
+ "2074": "Bouvet Island",
4811
+ "2076": "Brazil",
4812
+ "2084": "Belize",
4813
+ "2086": "British Indian Ocean Territory",
4814
+ "2090": "Solomon Islands",
4815
+ "2092": "British Virgin Islands",
4816
+ "2096": "Brunei",
4817
+ "2100": "Bulgaria",
4818
+ "2104": "Myanmar (Burma)",
4819
+ "2108": "Burundi",
4820
+ "2112": "Belarus",
4821
+ "2116": "Cambodia",
4822
+ "2120": "Cameroon",
4823
+ "2124": "Canada",
4824
+ "2132": "Cabo Verde",
4825
+ "2136": "Cayman Islands",
4826
+ "2140": "Central African Republic",
4827
+ "2144": "Sri Lanka",
4828
+ "2148": "Chad",
4829
+ "2152": "Chile",
4830
+ "2156": "China",
4831
+ "2158": "Taiwan",
4832
+ "2162": "Christmas Island",
4833
+ "2166": "Cocos (Keeling) Islands",
4834
+ "2170": "Colombia",
4835
+ "2174": "Comoros",
4836
+ "2175": "Mayotte",
4837
+ "2178": "Republic of the Congo",
4838
+ "2180": "Democratic Republic of the Congo",
4839
+ "2184": "Cook Islands",
4840
+ "2188": "Costa Rica",
4841
+ "2191": "Croatia",
4842
+ "2196": "Cyprus",
4843
+ "2203": "Czechia",
4844
+ "2204": "Benin",
4845
+ "2208": "Denmark",
4846
+ "2212": "Dominica",
4847
+ "2214": "Dominican Republic",
4848
+ "2218": "Ecuador",
4849
+ "2222": "El Salvador",
4850
+ "2226": "Equatorial Guinea",
4851
+ "2231": "Ethiopia",
4852
+ "2232": "Eritrea",
4853
+ "2233": "Estonia",
4854
+ "2234": "Faroe Islands",
4855
+ "2238": "Falkland Islands (Islas Malvinas)",
4856
+ "2239": "South Georgia and the South Sandwich Islands",
4857
+ "2242": "Fiji",
4858
+ "2246": "Finland",
4859
+ "2250": "France",
4860
+ "2254": "French Guiana",
4861
+ "2258": "French Polynesia",
4862
+ "2260": "French Southern and Antarctic Lands",
4863
+ "2262": "Djibouti",
4864
+ "2266": "Gabon",
4865
+ "2268": "Georgia",
4866
+ "2270": "The Gambia",
4867
+ "2275": "Palestine",
4868
+ "2276": "Germany",
4869
+ "2288": "Ghana",
4870
+ "2292": "Gibraltar",
4871
+ "2296": "Kiribati",
4872
+ "2300": "Greece",
4873
+ "2304": "Greenland",
4874
+ "2308": "Grenada",
4875
+ "2312": "Guadeloupe",
4876
+ "2316": "Guam",
4877
+ "2320": "Guatemala",
4878
+ "2324": "Guinea",
4879
+ "2328": "Guyana",
4880
+ "2332": "Haiti",
4881
+ "2334": "Heard Island and McDonald Islands",
4882
+ "2336": "Vatican City",
4883
+ "2340": "Honduras",
4884
+ "2344": "Hong Kong",
4885
+ "2348": "Hungary",
4886
+ "2352": "Iceland",
4887
+ "2356": "India",
4888
+ "2360": "Indonesia",
4889
+ "2368": "Iraq",
4890
+ "2372": "Ireland",
4891
+ "2376": "Israel",
4892
+ "2380": "Italy",
4893
+ "2384": "Cote d'Ivoire",
4894
+ "2388": "Jamaica",
4895
+ "2392": "Japan",
4896
+ "2398": "Kazakhstan",
4897
+ "2400": "Jordan",
4898
+ "2404": "Kenya",
4899
+ "2410": "South Korea",
4900
+ "2414": "Kuwait",
4901
+ "2417": "Kyrgyzstan",
4902
+ "2418": "Laos",
4903
+ "2422": "Lebanon",
4904
+ "2426": "Lesotho",
4905
+ "2428": "Latvia",
4906
+ "2430": "Liberia",
4907
+ "2434": "Libya",
4908
+ "2438": "Liechtenstein",
4909
+ "2440": "Lithuania",
4910
+ "2442": "Luxembourg",
4911
+ "2446": "Macao",
4912
+ "2450": "Madagascar",
4913
+ "2454": "Malawi",
4914
+ "2458": "Malaysia",
4915
+ "2462": "Maldives",
4916
+ "2466": "Mali",
4917
+ "2470": "Malta",
4918
+ "2474": "Martinique",
4919
+ "2478": "Mauritania",
4920
+ "2480": "Mauritius",
4921
+ "2484": "Mexico",
4922
+ "2492": "Monaco",
4923
+ "2496": "Mongolia",
4924
+ "2498": "Moldova",
4925
+ "2499": "Montenegro",
4926
+ "2500": "Montserrat",
4927
+ "2504": "Morocco",
4928
+ "2508": "Mozambique",
4929
+ "2512": "Oman",
4930
+ "2516": "Namibia",
4931
+ "2520": "Nauru",
4932
+ "2524": "Nepal",
4933
+ "2528": "Netherlands",
4934
+ "2531": "Curacao",
4935
+ "2533": "Aruba",
4936
+ "2534": "Sint Maarten",
4937
+ "2535": "Caribbean Netherlands",
4938
+ "2540": "New Caledonia",
4939
+ "2548": "Vanuatu",
4940
+ "2554": "New Zealand",
4941
+ "2558": "Nicaragua",
4942
+ "2562": "Niger",
4943
+ "2566": "Nigeria",
4944
+ "2570": "Niue",
4945
+ "2574": "Norfolk Island",
4946
+ "2578": "Norway",
4947
+ "2580": "Northern Mariana Islands",
4948
+ "2581": "United States Minor Outlying Islands",
4949
+ "2583": "Micronesia",
4950
+ "2584": "Marshall Islands",
4951
+ "2585": "Palau",
4952
+ "2586": "Pakistan",
4953
+ "2591": "Panama",
4954
+ "2598": "Papua New Guinea",
4955
+ "2600": "Paraguay",
4956
+ "2604": "Peru",
4957
+ "2608": "Philippines",
4958
+ "2612": "Pitcairn Islands",
4959
+ "2616": "Poland",
4960
+ "2620": "Portugal",
4961
+ "2624": "Guinea-Bissau",
4962
+ "2626": "Timor-Leste",
4963
+ "2630": "Puerto Rico",
4964
+ "2634": "Qatar",
4965
+ "2638": "Reunion",
4966
+ "2642": "Romania",
4967
+ "2643": "Russia",
4968
+ "2646": "Rwanda",
4969
+ "2652": "Saint Barthelemy",
4970
+ "2654": "Saint Helena, Ascension and Tristan da Cunha",
4971
+ "2659": "Saint Kitts and Nevis",
4972
+ "2660": "Anguilla",
4973
+ "2662": "Saint Lucia",
4974
+ "2663": "Saint Martin",
4975
+ "2666": "Saint Pierre and Miquelon",
4976
+ "2670": "Saint Vincent and the Grenadines",
4977
+ "2674": "San Marino",
4978
+ "2678": "Sao Tome and Principe",
4979
+ "2682": "Saudi Arabia",
4980
+ "2686": "Senegal",
4981
+ "2688": "Serbia",
4982
+ "2690": "Seychelles",
4983
+ "2694": "Sierra Leone",
4984
+ "2702": "Singapore",
4985
+ "2703": "Slovakia",
4986
+ "2704": "Vietnam",
4987
+ "2705": "Slovenia",
4988
+ "2706": "Somalia",
4989
+ "2710": "South Africa",
4990
+ "2716": "Zimbabwe",
4991
+ "2724": "Spain",
4992
+ "2728": "South Sudan",
4993
+ "2732": "Western Sahara",
4994
+ "2736": "Sudan",
4995
+ "2740": "Suriname",
4996
+ "2744": "Svalbard and Jan Mayen",
4997
+ "2748": "Eswatini",
4998
+ "2752": "Sweden",
4999
+ "2756": "Switzerland",
5000
+ "2760": "Syria",
5001
+ "2762": "Tajikistan",
5002
+ "2764": "Thailand",
5003
+ "2768": "Togo",
5004
+ "2772": "Tokelau",
5005
+ "2776": "Tonga",
5006
+ "2780": "Trinidad and Tobago",
5007
+ "2784": "United Arab Emirates",
5008
+ "2788": "Tunisia",
5009
+ "2792": "Turkiye",
5010
+ "2795": "Turkmenistan",
5011
+ "2796": "Turks and Caicos Islands",
5012
+ "2798": "Tuvalu",
5013
+ "2800": "Uganda",
5014
+ "2804": "Ukraine",
5015
+ "2807": "North Macedonia",
5016
+ "2818": "Egypt",
5017
+ "2826": "United Kingdom",
5018
+ "2831": "Guernsey",
5019
+ "2832": "Jersey",
5020
+ "2833": "Isle of Man",
5021
+ "2834": "Tanzania",
5022
+ "2840": "United States",
5023
+ "2850": "U.S. Virgin Islands",
5024
+ "2854": "Burkina Faso",
5025
+ "2858": "Uruguay",
5026
+ "2860": "Uzbekistan",
5027
+ "2862": "Venezuela",
5028
+ "2876": "Wallis and Futuna",
5029
+ "2882": "Samoa",
5030
+ "2887": "Yemen",
5031
+ "2894": "Zambia",
5032
+ "2900": "Kosovo"
5033
+ };
5034
+ var LANGUAGE_CONSTANTS = {
5035
+ "1000": "English",
5036
+ "1001": "German",
5037
+ "1002": "French",
5038
+ "1003": "Spanish",
5039
+ "1004": "Italian",
5040
+ "1005": "Japanese",
5041
+ "1009": "Danish",
5042
+ "1010": "Dutch",
5043
+ "1011": "Finnish",
5044
+ "1012": "Korean",
5045
+ "1013": "Norwegian",
5046
+ "1014": "Portuguese",
5047
+ "1015": "Swedish",
5048
+ "1017": "Chinese (simplified)",
5049
+ "1018": "Chinese (traditional)",
5050
+ "1019": "Arabic",
5051
+ "1020": "Bulgarian",
5052
+ "1021": "Czech",
5053
+ "1022": "Greek",
5054
+ "1023": "Hindi",
5055
+ "1024": "Hungarian",
5056
+ "1025": "Indonesian",
5057
+ "1026": "Icelandic",
5058
+ "1027": "Hebrew",
5059
+ "1028": "Latvian",
5060
+ "1029": "Lithuanian",
5061
+ "1030": "Polish",
5062
+ "1031": "Russian",
5063
+ "1032": "Romanian",
5064
+ "1033": "Slovak",
5065
+ "1034": "Slovenian",
5066
+ "1035": "Serbian",
5067
+ "1036": "Ukrainian",
5068
+ "1037": "Turkish",
5069
+ "1038": "Catalan",
5070
+ "1039": "Croatian",
5071
+ "1040": "Vietnamese",
5072
+ "1041": "Urdu",
5073
+ "1042": "Filipino",
5074
+ "1043": "Estonian",
5075
+ "1044": "Thai",
5076
+ "1056": "Bengali",
5077
+ "1064": "Persian",
5078
+ "1072": "Gujarati",
5079
+ "1086": "Kannada",
5080
+ "1098": "Malayalam",
5081
+ "1101": "Marathi",
5082
+ "1102": "Malay",
5083
+ "1110": "Punjabi",
5084
+ "1130": "Tamil",
5085
+ "1131": "Telugu"
5086
+ };
5087
+
4784
5088
  // ../api/src/ads-google/limits.ts
4785
5089
  var GOOGLE_ADS_LIMITS = {
4786
5090
  budget: {
@@ -4841,7 +5145,9 @@ var GOOGLE_ADS_LIMITS = {
4841
5145
  sitelinkLinkTextMax: 25,
4842
5146
  sitelinkDescriptionMax: 35,
4843
5147
  calloutTextMax: 25,
4844
- structuredSnippetHeaderMax: 25,
5148
+ // A snippet's HEADER has no length limit of its own — it has to be one of
5149
+ // Google's published headers (`structured-snippet-headers.ts`), the longest
5150
+ // of which is 29 characters. Only the values are capped.
4845
5151
  structuredSnippetValuesMin: 3,
4846
5152
  structuredSnippetValuesMax: 10
4847
5153
  },
@@ -5021,6 +5327,500 @@ var LANGUAGE_CONSTANT_REGEX = /^languageConstants\/\d+$/;
5021
5327
 
5022
5328
  // ../api/src/ads-google/ops.ts
5023
5329
  import { z as z15 } from "zod";
5330
+
5331
+ // ../api/src/ads-google/structured-snippet-headers.ts
5332
+ var STRUCTURED_SNIPPET_HEADERS_EN = [
5333
+ "Brands",
5334
+ "Amenities",
5335
+ "Styles",
5336
+ "Types",
5337
+ "Destinations",
5338
+ "Services",
5339
+ "Courses",
5340
+ "Neighborhoods",
5341
+ "Shows",
5342
+ "Insurance coverage",
5343
+ "Degree programs",
5344
+ "Featured hotels",
5345
+ "Models"
5346
+ ];
5347
+ var STRUCTURED_SNIPPET_HEADERS_LOCALIZED = [
5348
+ "Aanbevolen hotels",
5349
+ "Acara",
5350
+ "Apdro\u0161in\u0101\u0161ana",
5351
+ "Apkaimes",
5352
+ "Arredores",
5353
+ "Asigurare",
5354
+ "Asseguran\xE7a",
5355
+ "Ausstattung",
5356
+ "Automerkit",
5357
+ "Bairros",
5358
+ "Barrios",
5359
+ "Barris",
5360
+ "Bestemmingen",
5361
+ "Biztos\xEDt\xE1si m\xF3dozat",
5362
+ "Blagovne znamke",
5363
+ "Brand",
5364
+ "Br\xE4ndid",
5365
+ "Br\xE4ndit",
5366
+ "Buurten",
5367
+ "Cakupan asuransi",
5368
+ "Carreras universitarias",
5369
+ "Cartiere",
5370
+ "Ch\u01B0\u01A1ng tr\xECnh",
5371
+ "Cilji",
5372
+ "Cobertura de seguro",
5373
+ "Cobertura do seguro",
5374
+ "Comodidades",
5375
+ "Coperture assicurativa",
5376
+ "Corsi",
5377
+ "Corsi di laurea",
5378
+ "Cours",
5379
+ "Couverture d'assurance",
5380
+ "Cursos",
5381
+ "Cursuri",
5382
+ "Cursussen",
5383
+ "C\xEDle",
5384
+ "C\u1EA5p b\u1EB1ng",
5385
+ "Degree programmes",
5386
+ "Dekking",
5387
+ "Design",
5388
+ "Destinacions",
5389
+ "Destinasi",
5390
+ "Destinasjoner",
5391
+ "Destinationer",
5392
+ "Destinazioni",
5393
+ "Destina\u021Bii",
5394
+ "Destinos",
5395
+ "Destin\xE1cie",
5396
+ "Dienstleistungen",
5397
+ "Diplomaprogramok",
5398
+ "Dot\u0103ri",
5399
+ "Draudimo apr\u0117ptis",
5400
+ "Dzielnice",
5401
+ "D\u1ECBch v\u1EE5",
5402
+ "Emisije",
5403
+ "Emisiuni",
5404
+ "Espect\xE1culos",
5405
+ "Estilos",
5406
+ "Estils",
5407
+ "Faciliteter",
5408
+ "Fasilitas",
5409
+ "Fasiliteter",
5410
+ "Forsikringsdekning",
5411
+ "Forsikringsd\xE6kning",
5412
+ "F\xF6rs\xE4kringstyper",
5413
+ "Galam\u0113r\u0137i",
5414
+ "Gaya",
5415
+ "Hizmetler",
5416
+ "Hotel consigliati",
5417
+ "Hotel ditampilkan",
5418
+ "Hotel pilihan",
5419
+ "Hoteles destacados",
5420
+ "Hotels destacats",
5421
+ "Hoteluri prezentate",
5422
+ "Hot\xE9is em destaque",
5423
+ "Istaknuti hoteli",
5424
+ "Itinatampok na hotel",
5425
+ "Jenama",
5426
+ "Jenis",
5427
+ "Kaupunginosat",
5428
+ "Kawasan",
5429
+ "Kejiranan",
5430
+ "Kemudahan",
5431
+ "Kh\xE1ch s\u1EA1n n\u1ED5i b\u1EADt",
5432
+ "Kh\xF3a h\u1ECDc",
5433
+ "Kiemelt sz\xE1llod\xE1k",
5434
+ "Kierunki studi\xF3w",
5435
+ "Kindlustuskaitse",
5436
+ "Ki\u1EC3u",
5437
+ "Kohteet",
5438
+ "Kraadi\xF5ppeprogrammid",
5439
+ "Kritje zavarovanj",
5440
+ "Kurs",
5441
+ "Kursai",
5442
+ "Kurse",
5443
+ "Kurser",
5444
+ "Kursi",
5445
+ "Kurslar",
5446
+ "Kurssit",
5447
+ "Kursus",
5448
+ "Kursused",
5449
+ "Kursy",
5450
+ "Kurzy",
5451
+ "Laidos",
5452
+ "Layanan",
5453
+ "Licenciaturas",
5454
+ "Liputan insurans",
5455
+ "Lisans programlar\u0131",
5456
+ "Lis\xE4palvelut",
5457
+ "Lokalomr\xE5der",
5458
+ "Lo\u1EA1i",
5459
+ "Mahalleler",
5460
+ "Marcas",
5461
+ "Markalar",
5462
+ "Marken",
5463
+ "Marki",
5464
+ "Marques",
5465
+ "Mata pelajaran",
5466
+ "Merek",
5467
+ "Merken",
5468
+ "Merkevarer",
5469
+ "Mga Amenity",
5470
+ "Mga Brand",
5471
+ "Mga Destinasyon",
5472
+ "Mga Istilo",
5473
+ "Mga Komunidad",
5474
+ "Mga Kurso",
5475
+ "Mga Modelo",
5476
+ "Mga Palabas",
5477
+ "Mga Serbisyo",
5478
+ "Mga Uri",
5479
+ "Mga degree program",
5480
+ "Miejsca",
5481
+ "Model",
5482
+ "Modele",
5483
+ "Modeli",
5484
+ "Modeliai",
5485
+ "Modelle",
5486
+ "Modellek",
5487
+ "Modellen",
5488
+ "Modeller",
5489
+ "Modelli",
5490
+ "Modelos",
5491
+ "Modely",
5492
+ "Mode\u013Ci",
5493
+ "Mod\xE8les",
5494
+ "Moksliniai laipsniai",
5495
+ "Mudelid",
5496
+ "Mugavusteenused",
5497
+ "M\xE1rk\xE1k",
5498
+ "M\u0103rci",
5499
+ "M\u0171sorok",
5500
+ "Nabolag",
5501
+ "Nam\u0173 apylink\u0117s",
5502
+ "Neighbourhoods",
5503
+ "Oddaje",
5504
+ "Odpor\xFA\u010Dan\xE9 hotely",
5505
+ "Odredi\u0161ta",
5506
+ "Oppiaineet",
5507
+ "Osiguranje",
5508
+ "Pakalpojumi",
5509
+ "Palvelut",
5510
+ "Paskirties vietos",
5511
+ "Paslaugos",
5512
+ "Patogumai",
5513
+ "Perkhidmatan",
5514
+ "Ph\u1EA1m vi b\u1EA3o hi\u1EC3m",
5515
+ "Pied\u0101v\u0101t\u0101s viesn\u012Bcas",
5516
+ "Poistenie",
5517
+ "Poji\u0161t\u011Bn\xED",
5518
+ "Polecane hotele",
5519
+ "Ponudba",
5520
+ "Po\u0159ady",
5521
+ "Predstavljeni hoteli",
5522
+ "Preki\u0173 \u017Eenklai",
5523
+ "Program",
5524
+ "Program ijazah",
5525
+ "Program sarjana",
5526
+ "Programas",
5527
+ "Programas de gradua\xE7\xE3o",
5528
+ "Programe de studiu",
5529
+ "Programes",
5530
+ "Programlar",
5531
+ "Programmer",
5532
+ "Programmes d'\xE9tudes",
5533
+ "Programmi",
5534
+ "Programy",
5535
+ "P\u0101rraides",
5536
+ "Quartieri",
5537
+ "Quartiers",
5538
+ "Rancangan",
5539
+ "Rel\xE1cie",
5540
+ "Resm\xE5l",
5541
+ "Robne marke",
5542
+ "Saated ja etendused",
5543
+ "Sadr\u017Eaji",
5544
+ "Sakop ng insurance",
5545
+ "Serien",
5546
+ "Serier",
5547
+ "Serveis",
5548
+ "Serveis addicionals",
5549
+ "Servicii",
5550
+ "Servicios",
5551
+ "Servicios adicionales",
5552
+ "Servizi",
5553
+ "Servi\xE7os",
5554
+ "Show't",
5555
+ "Sigorta kapsam\u0131",
5556
+ "Sihtkohad",
5557
+ "Si\u016Blomi vie\u0161bu\u010Diai",
5558
+ "Slogi",
5559
+ "Slu\u017Eby",
5560
+ "Soovitatud hotellid",
5561
+ "Soseske",
5562
+ "Stiilid",
5563
+ "Stijlen",
5564
+ "Stilar",
5565
+ "Stile",
5566
+ "Stiler",
5567
+ "Stili",
5568
+ "Stiliai",
5569
+ "Stiller",
5570
+ "Stilovi",
5571
+ "Stiluri",
5572
+ "Storitve",
5573
+ "Studieng\xE4nge",
5574
+ "Studieprogramma's",
5575
+ "Studijn\xED programy",
5576
+ "Studijski programi",
5577
+ "Studiju programmas",
5578
+ "Style",
5579
+ "Styly",
5580
+ "St\xEDlusok",
5581
+ "Sunulan olanaklar",
5582
+ "Suositellut hotellit",
5583
+ "Szolg\xE1ltat\xE1sok",
5584
+ "S\xE9lection d'h\xF4tels",
5585
+ "Tanfolyamok",
5586
+ "Teenused",
5587
+ "Te\u010Dajevi",
5588
+ "Te\u010Daji",
5589
+ "Th\u01B0\u01A1ng hi\u1EC7u",
5590
+ "Tipai",
5591
+ "Tipi",
5592
+ "Tipos",
5593
+ "Tipuri",
5594
+ "Tipus",
5595
+ "Titulacions",
5596
+ "Ti\u1EC7n nghi",
5597
+ "Tjenester",
5598
+ "Tj\xE4nster",
5599
+ "Typen",
5600
+ "Typer",
5601
+ "Typy",
5602
+ "Tyylit",
5603
+ "Tyypit",
5604
+ "T\xEDpusok",
5605
+ "T\xFCrler",
5606
+ "T\xFC\xFCbid",
5607
+ "Ubezpieczenia",
5608
+ "Uddannelser",
5609
+ "Udogodnienia",
5610
+ "Udvalgte hoteller",
5611
+ "Usluge",
5612
+ "Us\u0142ugi",
5613
+ "Utbildningsprogram",
5614
+ "Utdanningsprogrammer",
5615
+ "Utvalda hotell",
5616
+ "Utvalgte hoteller",
5617
+ "Vakuutukset",
5618
+ "Varum\xE4rken",
5619
+ "Veidi",
5620
+ "Versicherungsleistung",
5621
+ "Viertel",
5622
+ "Voorzieningen",
5623
+ "Vorgestellte Hotels",
5624
+ "Vrste",
5625
+ "Vybavenie",
5626
+ "Vybaven\xED",
5627
+ "Vybran\xE9 hotely",
5628
+ "Vzdel\xE1vacie programy",
5629
+ "V\xE1rosr\xE9szek",
5630
+ "V\xF9ng l\xE2n c\u1EADn",
5631
+ "Ziele",
5632
+ "Zna\u010Dky",
5633
+ "Zn\xE1m\xE9 oblasti",
5634
+ "Z\u012Bmoli",
5635
+ "destinasyonlar",
5636
+ "\xC9missions",
5637
+ "\xC9quipements",
5638
+ "\xD6ne \xE7\u0131kan oteller",
5639
+ "\xDAti c\xE9lok",
5640
+ "\xDCmbruskonnad",
5641
+ "\u010Cetvrti",
5642
+ "\u0110i\u1EC3m \u0111\u1EBFn",
5643
+ "\u0112rt\u012Bbas",
5644
+ "\u0160tudijski programi",
5645
+ "\u0160tvrte",
5646
+ "\u0160t\xFDly",
5647
+ "\u0391\u03C3\u03C6\u03B1\u03BB\u03B9\u03C3\u03C4\u03B9\u03BA\u03AE \u03BA\u03AC\u03BB\u03C5\u03C8\u03B7",
5648
+ "\u0393\u03B5\u03B9\u03C4\u03BF\u03BD\u03B9\u03AD\u03C2",
5649
+ "\u0395\u03BA\u03C0\u03BF\u03BC\u03C0\u03AD\u03C2",
5650
+ "\u0395\u03C0\u03C9\u03BD\u03C5\u03BC\u03AF\u03B5\u03C2",
5651
+ "\u039C\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03B1",
5652
+ "\u039C\u03BF\u03BD\u03C4\u03AD\u03BB\u03B1",
5653
+ "\u039E\u03B5\u03BD\u03BF\u03B4\u03BF\u03C7\u03B5\u03AF\u03B1",
5654
+ "\u03A0\u03B1\u03C1\u03BF\u03C7\u03AD\u03C2",
5655
+ "\u03A0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03C0\u03C4\u03C5\u03C7\u03AF\u03C9\u03BD",
5656
+ "\u03A0\u03C1\u03BF\u03BF\u03C1\u03B9\u03C3\u03BC\u03BF\u03AF",
5657
+ "\u03A3\u03C4\u03C5\u03BB",
5658
+ "\u03A4\u03CD\u03C0\u03BF\u03B9",
5659
+ "\u03A5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B5\u03C2",
5660
+ "\u0411\u0440\u0435\u043D\u0434\u0438",
5661
+ "\u0411\u0440\u0435\u043D\u0434\u044B",
5662
+ "\u0414\u0435\u0441\u0442\u0438\u043D\u0430\u0446\u0438\u0438",
5663
+ "\u0417\u0430\u0441\u0442\u0440\u0430\u0445\u043E\u0432\u043A\u0430",
5664
+ "\u0417\u0440\u0443\u0447\u043D\u043E\u0441\u0442\u0456",
5665
+ "\u041A\u0432\u0430\u0440\u0442\u0430\u043B\u0438",
5666
+ "\u041A\u0443\u0440\u0441\u0438",
5667
+ "\u041A\u0443\u0440\u0441\u043E\u0432\u0435",
5668
+ "\u041A\u0443\u0440\u0441\u044B",
5669
+ "\u041C\u0430\u0440\u043A\u0438",
5670
+ "\u041C\u0435\u0441\u0442\u0430",
5671
+ "\u041C\u043E\u0434\u0435\u043B\u0438",
5672
+ "\u041C\u043E\u0434\u0435\u043B\u0456",
5673
+ "\u041C\u0456\u0441\u0446\u044F",
5674
+ "\u041E\u0441\u0432\u0456\u0442\u043D\u0456 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438",
5675
+ "\u041F\u043E\u0441\u043B\u0443\u0433\u0438",
5676
+ "\u041F\u0440\u0435\u0434\u0430\u0432\u0430\u043D\u0438\u044F",
5677
+ "\u041F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0435\u043D\u0438 \u0445\u043E\u0442\u0435\u043B\u0438",
5678
+ "\u041F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B \u0432\u044B\u0441\u0448\u0435\u0433\u043E \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
5679
+ "\u0420\u0430\u0439\u043E\u043D\u044B",
5680
+ "\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0456 \u0433\u043E\u0442\u0435\u043B\u0456",
5681
+ "\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u0435 \u043E\u0442\u0435\u043B\u0438",
5682
+ "\u0421\u043F\u0435\u0446\u0438\u0430\u043B\u043D\u043E\u0441\u0442\u0438",
5683
+ "\u0421\u0442\u0438\u043B\u0438",
5684
+ "\u0421\u0442\u0438\u043B\u043E\u0432\u0435",
5685
+ "\u0421\u0442\u0438\u043B\u0456",
5686
+ "\u0421\u0442\u0440\u0430\u0445\u043E\u0432\u0430\u044F \u0437\u0430\u0449\u0438\u0442\u0430",
5687
+ "\u0421\u0442\u0440\u0430\u0445\u043E\u0432\u0438\u0439 \u0437\u0430\u0445\u0438\u0441\u0442",
5688
+ "\u0422\u0438\u043F\u0438",
5689
+ "\u0422\u0438\u043F\u043E\u0432\u0435",
5690
+ "\u0422\u0438\u043F\u044B",
5691
+ "\u0423\u0434\u043E\u0431\u0441\u0442\u0432\u0430",
5692
+ "\u0423\u0441\u043B\u0443\u0433\u0438",
5693
+ "\u0428\u043E\u0443",
5694
+ "\u0431\u0440\u0435\u043D\u0434\u043E\u0432\u0438",
5695
+ "\u0434\u0435\u043B\u043E\u0432\u0438 \u0433\u0440\u0430\u0434\u0430",
5696
+ "\u0434\u0435\u0441\u0442\u0438\u043D\u0430\u0446\u0438\u0458\u0435",
5697
+ "\u0434\u0438\u043F\u043B\u043E\u043C\u0435",
5698
+ "\u0435\u043C\u0438\u0441\u0438\u0458\u0435",
5699
+ "\u0438\u0441\u0442\u0430\u043A\u043D\u0443\u0442\u0438 \u0445\u043E\u0442\u0435\u043B\u0438",
5700
+ "\u043A\u0443\u0440\u0441\u0435\u0432\u0438",
5701
+ "\u043C\u043E\u0434\u0435\u043B\u0438",
5702
+ "\u043E\u0441\u0438\u0433\u0443\u0440\u0430\u045A\u0435",
5703
+ "\u0441\u0430\u0434\u0440\u0436\u0430\u0458\u0438",
5704
+ "\u0441\u0442\u0438\u043B\u043E\u0432\u0438",
5705
+ "\u0442\u0438\u043F\u043E\u0432\u0438",
5706
+ "\u0443\u0441\u043B\u0443\u0433\u0435",
5707
+ "\u05D3\u05D2\u05DE\u05D9\u05DD",
5708
+ "\u05D4\u05D5\u05E4\u05E2\u05D5\u05EA \u05D5\u05EA\u05D5\u05DB\u05E0\u05D9\u05D5\u05EA",
5709
+ "\u05D9\u05E2\u05D3\u05D9\u05DD \u05D2\u05D9\u05D0\u05D5\u05D2\u05E8\u05E4\u05D9\u05D9\u05DD",
5710
+ "\u05DB\u05D9\u05E1\u05D5\u05D9 \u05D1\u05D9\u05D8\u05D5\u05D7\u05D9",
5711
+ "\u05DE\u05D5\u05EA\u05D2\u05D9\u05DD",
5712
+ "\u05DE\u05DC\u05D5\u05E0\u05D5\u05EA \u05DE\u05D5\u05DE\u05DC\u05E6\u05D9\u05DD",
5713
+ "\u05E1\u05D2\u05E0\u05D5\u05E0\u05D5\u05EA",
5714
+ "\u05E1\u05D5\u05D2\u05D9\u05DD",
5715
+ "\u05E7\u05D5\u05E8\u05E1\u05D9\u05DD",
5716
+ "\u05E9\u05D9\u05E8\u05D5\u05EA\u05D9 \u05D4\u05DE\u05E7\u05D5\u05DD",
5717
+ "\u05E9\u05D9\u05E8\u05D5\u05EA\u05D9\u05DD",
5718
+ "\u05E9\u05DB\u05D5\u05E0\u05D5\u05EA",
5719
+ "\u05EA\u05D5\u05DB\u05E0\u05D9\u05D5\u05EA \u05DC\u05DC\u05D9\u05DE\u05D5\u05D3\u05D9 \u05EA\u05D5\u05D0\u05E8",
5720
+ "\u0627\u0644\u0623\u062D\u064A\u0627\u0621",
5721
+ "\u0627\u0644\u0623\u0646\u0645\u0627\u0637",
5722
+ "\u0627\u0644\u0623\u0646\u0648\u0627\u0639",
5723
+ "\u0627\u0644\u062A\u063A\u0637\u064A\u0629 \u0627\u0644\u062A\u0623\u0645\u064A\u0646\u064A\u0629",
5724
+ "\u0627\u0644\u062E\u062F\u0645\u0627\u062A",
5725
+ "\u0627\u0644\u062F\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u062F\u0631\u064A\u0628\u064A\u0629",
5726
+ "\u0627\u0644\u0639\u0631\u0648\u0636",
5727
+ "\u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u062A\u062C\u0627\u0631\u064A\u0629",
5728
+ "\u0627\u0644\u0641\u0646\u0627\u062F\u0642 \u0627\u0644\u0645\u0645\u064A\u0651\u0632\u0629",
5729
+ "\u0627\u0644\u0646\u0645\u0627\u0630\u062C",
5730
+ "\u0627\u0644\u0648\u062C\u0647\u0627\u062A",
5731
+ "\u0628\u0631\u0627\u0645\u062C \u0627\u0644\u0634\u0647\u0627\u062F\u0627\u062A",
5732
+ "\u0648\u0633\u0627\u0626\u0644 \u0627\u0644\u0631\u0627\u062D\u0629",
5733
+ "\u0906\u0938-\u092A\u0921\u093C\u094B\u0938",
5734
+ "\u0917\u0902\u0924\u0935\u094D\u092F",
5735
+ "\u0921\u093F\u0917\u094D\u0930\u0940 \u0915\u093E\u0930\u094D\u092F\u0915\u094D\u0930\u092E",
5736
+ "\u092A\u093E\u0920\u094D\u200D\u092F\u0915\u094D\u0930\u092E",
5737
+ "\u092A\u094D\u0930\u0915\u093E\u0930",
5738
+ "\u092A\u094D\u0930\u0926\u0930\u094D\u0936\u093F\u0924 \u0939\u094B\u091F\u0932",
5739
+ "\u092C\u0940\u092E\u093E \u0915\u0935\u0930\u0947\u091C",
5740
+ "\u092C\u094D\u0930\u093E\u0902\u0921",
5741
+ "\u092E\u0949\u0921\u0932",
5742
+ "\u0936\u0948\u0932\u093F\u092F\u093E\u0902",
5743
+ "\u0936\u094B",
5744
+ "\u0938\u0941\u0935\u093F\u0927\u093E\u090F\u0902",
5745
+ "\u0938\u0947\u0935\u093E\u090F\u0902",
5746
+ "\u0E04\u0E27\u0E32\u0E21\u0E04\u0E38\u0E49\u0E21\u0E04\u0E23\u0E2D\u0E07\u0E43\u0E19\u0E1B\u0E23\u0E30\u0E01\u0E31\u0E19",
5747
+ "\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23",
5748
+ "\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17",
5749
+ "\u0E1B\u0E25\u0E32\u0E22\u0E17\u0E32\u0E07",
5750
+ "\u0E22\u0E48\u0E32\u0E19\u0E43\u0E01\u0E25\u0E49\u0E40\u0E04\u0E35\u0E22\u0E07",
5751
+ "\u0E23\u0E38\u0E48\u0E19",
5752
+ "\u0E2A\u0E34\u0E48\u0E07\u0E2D\u0E33\u0E19\u0E27\u0E22\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E30\u0E14\u0E27\u0E01",
5753
+ "\u0E2A\u0E44\u0E15\u0E25\u0E4C",
5754
+ "\u0E2B\u0E25\u0E31\u0E01\u0E2A\u0E39\u0E15\u0E23",
5755
+ "\u0E2B\u0E25\u0E31\u0E01\u0E2A\u0E39\u0E15\u0E23\u0E1B\u0E23\u0E34\u0E0D\u0E0D\u0E32",
5756
+ "\u0E41\u0E1A\u0E23\u0E19\u0E14\u0E4C",
5757
+ "\u0E42\u0E0A\u0E27\u0E4C",
5758
+ "\u0E42\u0E23\u0E07\u0E41\u0E23\u0E21\u0E40\u0E14\u0E48\u0E19",
5759
+ "\u304A\u3059\u3059\u3081\u306E\u30DB\u30C6\u30EB",
5760
+ "\u30B3\u30FC\u30B9",
5761
+ "\u30B5\u30FC\u30D3\u30B9",
5762
+ "\u30B9\u30BF\u30A4\u30EB",
5763
+ "\u30BF\u30A4\u30D7",
5764
+ "\u30D6\u30E9\u30F3\u30C9",
5765
+ "\u30E2\u30C7\u30EB",
5766
+ "\u4FDD\u967A\u306E\u4FDD\u969C",
5767
+ "\u4FDD\u969C\u7BC4\u570D",
5768
+ "\u5230\u7740\u5730",
5769
+ "\u5468\u8FBA\u5730\u57DF",
5770
+ "\u54C1\u724C",
5771
+ "\u578B\u53F7",
5772
+ "\u578B\u865F",
5773
+ "\u5B66\u4F4D\u30D7\u30ED\u30B0\u30E9\u30E0",
5774
+ "\u5B66\u4F4D\u8BFE\u7A0B",
5775
+ "\u5B78\u4F4D\u8AB2\u7A0B",
5776
+ "\u627F\u4FDD\u7BC4\u570D",
5777
+ "\u670D\u52A1",
5778
+ "\u670D\u52D9",
5779
+ "\u6B3E\u5F0F",
5780
+ "\u7279\u8272\u9152\u5E97",
5781
+ "\u756A\u7D44",
5782
+ "\u76EE\u7684\u5730",
5783
+ "\u793E\u533A",
5784
+ "\u793E\u5340",
5785
+ "\u7BC0\u76EE",
5786
+ "\u7C7B\u578B",
5787
+ "\u7CBE\u9009\u9152\u5E97",
5788
+ "\u7CBE\u9078\u98EF\u5E97",
5789
+ "\u8282\u76EE",
5790
+ "\u8A2D\u5099",
5791
+ "\u8A2D\u65BD",
5792
+ "\u8AB2\u7A0B",
5793
+ "\u8BBE\u65BD",
5794
+ "\u8BFE\u7A0B",
5795
+ "\u9669\u79CD",
5796
+ "\u985E\u578B",
5797
+ "\uACFC\uC815",
5798
+ "\uBAA8\uB378",
5799
+ "\uBAA9\uC801\uC9C0",
5800
+ "\uBCF4\uD5D8 \uBCF4\uC0C1 \uBC94\uC704",
5801
+ "\uBE0C\uB79C\uB4DC",
5802
+ "\uC11C\uBE44\uC2A4",
5803
+ "\uC2A4\uD0C0\uC77C",
5804
+ "\uC720\uD615",
5805
+ "\uC778\uADFC \uC9C0\uC5ED",
5806
+ "\uCD94\uCC9C \uD638\uD154",
5807
+ "\uD3B8\uC758 \uC2DC\uC124",
5808
+ "\uD504\uB85C\uADF8\uB7A8",
5809
+ "\uD559\uC704 \uCDE8\uB4DD \uD504\uB85C\uADF8\uB7A8"
5810
+ ];
5811
+ var HEADER_ALIASES = /* @__PURE__ */ new Map([["service catalog", "Services"]]);
5812
+ var ACCEPTED = /* @__PURE__ */ new Set([...STRUCTURED_SNIPPET_HEADERS_EN, ...STRUCTURED_SNIPPET_HEADERS_LOCALIZED]);
5813
+ var BY_FOLDED_CASE = new Map([...ACCEPTED].map((header) => [header.toLowerCase(), header]));
5814
+ function canonicalStructuredSnippetHeader(header) {
5815
+ const trimmed = header.trim();
5816
+ if (ACCEPTED.has(trimmed)) {
5817
+ return trimmed;
5818
+ }
5819
+ const folded = trimmed.toLowerCase();
5820
+ return HEADER_ALIASES.get(folded) ?? BY_FOLDED_CASE.get(folded);
5821
+ }
5822
+
5823
+ // ../api/src/ads-google/ops.ts
5024
5824
  var tempRefSchema2 = z15.string().regex(TEMP_REF_REGEX2, "expected a g_temp_* reference");
5025
5825
  var refSchema = z15.union([
5026
5826
  z15.string().regex(RESOURCE_NAME_REGEX, "expected a customers/\u2026/\u2026/\u2026 resource name"),
@@ -5322,9 +6122,20 @@ var calloutAssetSchema = z15.object({
5322
6122
  type: z15.literal("callout"),
5323
6123
  calloutText: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax)
5324
6124
  });
6125
+ var structuredSnippetHeaderSchema = z15.string().min(1).transform((header, ctx) => {
6126
+ const canonical2 = canonicalStructuredSnippetHeader(header);
6127
+ if (!canonical2) {
6128
+ ctx.addIssue({
6129
+ code: "custom",
6130
+ message: `Google Ads does not accept "${header}" as a structured snippet header. Use one of: ${STRUCTURED_SNIPPET_HEADERS_EN.join(", ")} \u2014 or that header in the campaign's language.`
6131
+ });
6132
+ return z15.NEVER;
6133
+ }
6134
+ return canonical2;
6135
+ });
5325
6136
  var structuredSnippetAssetSchema = z15.object({
5326
6137
  type: z15.literal("structuredSnippet"),
5327
- header: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetHeaderMax),
6138
+ header: structuredSnippetHeaderSchema,
5328
6139
  values: z15.array(z15.string().min(1)).min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax)
5329
6140
  });
5330
6141
  var callToActionAssetSchema = z15.object({ type: z15.literal("callToAction"), callToAction: z15.string().min(1) });
@@ -5344,7 +6155,7 @@ var assetUpdateSchema = z15.object({
5344
6155
  description2: z15.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),
5345
6156
  finalUrls: z15.array(httpsUrlSchema2).min(1).optional(),
5346
6157
  calloutText: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax).optional(),
5347
- header: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetHeaderMax).optional(),
6158
+ header: structuredSnippetHeaderSchema.optional(),
5348
6159
  values: z15.array(z15.string().min(1)).min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax).optional(),
5349
6160
  callToAction: z15.string().min(1).optional(),
5350
6161
  text: z15.string().min(1).optional()
@@ -7544,73 +8355,11 @@ import { defineCommand as defineCommand27 } from "citty";
7544
8355
  import { defineCommand as defineCommand23 } from "citty";
7545
8356
 
7546
8357
  // src/geo-context.ts
7547
- var GOOGLE_ADS_LOCATIONS = [
7548
- { id: "2840", name: "United States" },
7549
- { id: "2826", name: "United Kingdom" },
7550
- { id: "2124", name: "Canada" },
7551
- { id: "2036", name: "Australia" },
7552
- { id: "2276", name: "Germany" },
7553
- { id: "2250", name: "France" },
7554
- { id: "2724", name: "Spain" },
7555
- { id: "2380", name: "Italy" },
7556
- { id: "2076", name: "Brazil" },
7557
- { id: "2484", name: "Mexico" },
7558
- { id: "2528", name: "Netherlands" },
7559
- { id: "2056", name: "Belgium" },
7560
- { id: "2040", name: "Austria" },
7561
- { id: "2756", name: "Switzerland" },
7562
- { id: "2620", name: "Portugal" },
7563
- { id: "2752", name: "Sweden" },
7564
- { id: "2578", name: "Norway" },
7565
- { id: "2208", name: "Denmark" },
7566
- { id: "2246", name: "Finland" },
7567
- { id: "2372", name: "Ireland" },
7568
- { id: "2554", name: "New Zealand" },
7569
- { id: "2356", name: "India" },
7570
- { id: "2392", name: "Japan" },
7571
- { id: "2410", name: "South Korea" },
7572
- { id: "2702", name: "Singapore" },
7573
- { id: "2032", name: "Argentina" },
7574
- { id: "2152", name: "Chile" },
7575
- { id: "2170", name: "Colombia" },
7576
- { id: "2604", name: "Peru" },
7577
- { id: "2616", name: "Poland" },
7578
- { id: "2203", name: "Czech Republic" },
7579
- { id: "2642", name: "Romania" },
7580
- { id: "2348", name: "Hungary" },
7581
- { id: "2710", name: "South Africa" },
7582
- { id: "2376", name: "Israel" },
7583
- { id: "2784", name: "United Arab Emirates" },
7584
- { id: "2682", name: "Saudi Arabia" },
7585
- { id: "2792", name: "Turkey" },
7586
- { id: "2608", name: "Philippines" },
7587
- { id: "2764", name: "Thailand" },
7588
- { id: "2458", name: "Malaysia" },
7589
- { id: "2360", name: "Indonesia" },
7590
- { id: "2704", name: "Vietnam" },
7591
- { id: "2158", name: "Taiwan" },
7592
- { id: "2344", name: "Hong Kong" }
7593
- ];
7594
- var GOOGLE_ADS_LANGUAGES = [
7595
- { id: "1000", name: "English" },
7596
- { id: "1003", name: "Spanish" },
7597
- { id: "1001", name: "German" },
7598
- { id: "1002", name: "French" },
7599
- { id: "1004", name: "Italian" },
7600
- { id: "1014", name: "Portuguese" },
7601
- { id: "1010", name: "Japanese" },
7602
- { id: "1012", name: "Korean" },
7603
- { id: "1017", name: "Chinese (Simplified)" },
7604
- { id: "1019", name: "Arabic" },
7605
- { id: "1031", name: "Russian" },
7606
- { id: "1030", name: "Polish" },
7607
- { id: "1037", name: "Turkish" },
7608
- { id: "1015", name: "Swedish" },
7609
- { id: "1013", name: "Norwegian" },
7610
- { id: "1009", name: "Danish" },
7611
- { id: "1011", name: "Finnish" },
7612
- { id: "1005", name: "Dutch" }
7613
- ];
8358
+ function toOptions(names) {
8359
+ return Object.entries(names).map(([id, name]) => ({ id, name })).sort((a, b) => a.name.localeCompare(b.name));
8360
+ }
8361
+ var GOOGLE_ADS_LOCATIONS = toOptions(GEO_TARGET_COUNTRIES);
8362
+ var GOOGLE_ADS_LANGUAGES = toOptions(LANGUAGE_CONSTANTS);
7614
8363
  var DATAFORSEO_LOCATIONS = [
7615
8364
  { code: "us", name: "United States" },
7616
8365
  { code: "uk", name: "United Kingdom" },
@@ -7687,8 +8436,6 @@ function toRecord(list) {
7687
8436
  }
7688
8437
  return map;
7689
8438
  }
7690
- var adsLocationMap = toRecord(GOOGLE_ADS_LOCATIONS);
7691
- var adsLanguageMap = toRecord(GOOGLE_ADS_LANGUAGES);
7692
8439
  var researchLocationMap = toRecord(DATAFORSEO_LOCATIONS);
7693
8440
  var researchLanguageMap = toRecord(DATAFORSEO_LANGUAGES);
7694
8441
  function buildAdsQueryContext(locationArg, languageArg) {
@@ -7696,8 +8443,8 @@ function buildAdsQueryContext(locationArg, languageArg) {
7696
8443
  const languageId = languageArg ?? "1000";
7697
8444
  const locationIsDefault = !locationArg;
7698
8445
  const languageIsDefault = !languageArg;
7699
- const locationName = adsLocationMap[locationId] ?? `ID ${locationId}`;
7700
- const languageName = adsLanguageMap[languageId] ?? `ID ${languageId}`;
8446
+ const locationName = GEO_TARGET_COUNTRIES[locationId] ?? `ID ${locationId}`;
8447
+ const languageName = LANGUAGE_CONSTANTS[languageId] ?? `ID ${languageId}`;
7701
8448
  const ctx = {
7702
8449
  location: `${locationName} (${locationId})`,
7703
8450
  language: `${languageName} (${languageId})`,
@@ -9968,10 +10715,7 @@ import { readFileSync as readFileSync4 } from "fs";
9968
10715
  var DAY_MS2 = 864e5;
9969
10716
  function handleLinkedinError(err) {
9970
10717
  if (err instanceof ApiError) {
9971
- if (err.code === "UNAUTHORIZED") {
9972
- handleConnectionError("linkedin_ads", err.message);
9973
- }
9974
- if (err.code === "NOT_FOUND") {
10718
+ if (needsConnectionFix(err.code, err.message)) {
9975
10719
  handleConnectionError("linkedin_ads", err.message);
9976
10720
  }
9977
10721
  if (isNoAccountsSelectedError(err.code, err.message)) {
@@ -15361,10 +16105,10 @@ function duplicateCommand2(entity, label) {
15361
16105
  replace: { type: "boolean", description: "Pause the original once the copy publishes" }
15362
16106
  },
15363
16107
  run: async ({ args }) => {
15364
- const { apiPost: apiPost2 } = await import("./client-R5ZSVIK3.js");
16108
+ const { apiPost: apiPost2 } = await import("./client-XRQWOADV.js");
15365
16109
  const { requireChatId: requireChatId2 } = await import("./env-3JMYIH25.js");
15366
- const { writeJsonEnvelope: writeJsonEnvelope2 } = await import("./output-KLK2GZXR.js");
15367
- const { handleMetaError: handleMetaError2 } = await import("./shared-AXAXNKGE.js");
16110
+ const { writeJsonEnvelope: writeJsonEnvelope2 } = await import("./output-FL7WRIJF.js");
16111
+ const { handleMetaError: handleMetaError2 } = await import("./shared-OIYLDW3G.js");
15368
16112
  try {
15369
16113
  const accountId = bareAccountId2(args);
15370
16114
  const chatId = requireChatId2();
@@ -16243,16 +16987,27 @@ async function runList(args) {
16243
16987
  const accountId = resolveAccountIdArg(args);
16244
16988
  const params = { "account-id": accountId };
16245
16989
  if (args["skip-cache"]) params["skip-cache"] = "true";
16246
- const data = await apiGet("/api/ads/meta/pixels", params);
16247
- emit(data, args);
16990
+ const { pixels, restrictedFields } = await apiGet("/api/ads/meta/pixels", params);
16991
+ emit(pixels, args, pixelWarnings(restrictedFields));
16248
16992
  }
16249
- function emit(data, args) {
16993
+ function pixelWarnings(restrictedFields) {
16994
+ if (restrictedFields.length === 0) {
16995
+ return [];
16996
+ }
16997
+ return [
16998
+ {
16999
+ code: "PIXEL_FIELDS_RESTRICTED",
17000
+ message: `Meta withheld ${restrictedFields.join(", ")} for these pixels \u2014 the connected user holds no role in the Business that owns them. IDs, names, creation and last-fired times are complete; install code and setup details are not. To get them, the client assigns the pixel to the connected user in Meta Business settings \u2192 Data sources \u2192 Datasets.`
17001
+ }
17002
+ ];
17003
+ }
17004
+ function emit(data, args, warnings = []) {
16250
17005
  const fmt = csvOrJson(args);
16251
17006
  if (fmt !== "json") {
16252
17007
  writeAdsOutput(data, fmt);
16253
17008
  return;
16254
17009
  }
16255
- writeAdsJson({ ok: true, data });
17010
+ writeAdsJson({ ok: true, data, ...warnings.length > 0 ? { warnings } : {} });
16256
17011
  }
16257
17012
 
16258
17013
  // src/commands/ads/meta/preview.ts
@@ -16417,7 +17172,7 @@ function accountHints4(accounts) {
16417
17172
  }
16418
17173
  function handleAccountsError2(err) {
16419
17174
  if (err instanceof ApiError) {
16420
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
17175
+ if (needsConnectionFix(err.code, err.message)) {
16421
17176
  handleConnectionError("x_ads", err.message);
16422
17177
  }
16423
17178
  const envelope = {
@@ -16592,7 +17347,7 @@ ${list}`
16592
17347
  });
16593
17348
  process.exit(1);
16594
17349
  } catch (err) {
16595
- if (err instanceof ApiError && (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND")) {
17350
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
16596
17351
  handleConnectionError("x_ads", err.message);
16597
17352
  }
16598
17353
  writeAdsJson({
@@ -25774,7 +26529,7 @@ ${list}`
25774
26529
  });
25775
26530
  process.exit(1);
25776
26531
  } catch (err) {
25777
- if (err instanceof ApiError && (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND")) {
26532
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
25778
26533
  handleConnectionError("ga4", err.message);
25779
26534
  }
25780
26535
  writeJsonEnvelope({
@@ -25903,7 +26658,7 @@ Examples:
25903
26658
  writeJsonEnvelope({ ok: true, data, hints: propertyHints(data) });
25904
26659
  } catch (err) {
25905
26660
  if (err instanceof ApiError) {
25906
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
26661
+ if (needsConnectionFix(err.code, err.message)) {
25907
26662
  handleConnectionError("ga4", err.message);
25908
26663
  }
25909
26664
  writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
@@ -26231,7 +26986,7 @@ ${list}`
26231
26986
  });
26232
26987
  process.exit(1);
26233
26988
  } catch (err) {
26234
- if (err instanceof ApiError && (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND")) {
26989
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
26235
26990
  handleConnectionError("gsc", err.message);
26236
26991
  }
26237
26992
  writeJsonEnvelope({
@@ -26538,7 +27293,7 @@ Examples:
26538
27293
  writeJsonEnvelope({ ok: true, data, hints: siteHints(data) });
26539
27294
  } catch (err) {
26540
27295
  if (err instanceof ApiError) {
26541
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
27296
+ if (needsConnectionFix(err.code, err.message)) {
26542
27297
  handleConnectionError("gsc", err.message);
26543
27298
  }
26544
27299
  writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
@@ -26689,7 +27444,7 @@ Full guide: __tooling__/docs/tools/baker/history.md`
26689
27444
  import { defineCommand as defineCommand114 } from "citty";
26690
27445
  var EMBED_TYPES = ["legacy", "v4", "unknown"];
26691
27446
  function failNotConnected(err) {
26692
- if (err instanceof ApiError && err.code === "UNAUTHORIZED" && err.message.includes(HUBSPOT_MISSING_GRANT_MARKER)) {
27447
+ if (err instanceof ApiError && err.code === "FORBIDDEN" && err.message.includes(HUBSPOT_MISSING_GRANT_MARKER)) {
26693
27448
  writeJson({
26694
27449
  ok: false,
26695
27450
  error: {
@@ -33028,7 +33783,7 @@ function handleError3(err) {
33028
33783
  error: {
33029
33784
  code: err.code,
33030
33785
  message: err.message,
33031
- ...err.code === "UNAUTHORIZED" ? {
33786
+ ...err.code === "UNAUTHORIZED" || err.code === "FORBIDDEN" && isNotConnectedError(err.code, err.message) ? {
33032
33787
  fix: {
33033
33788
  action: "request_connection",
33034
33789
  explanation: 'Tag Manager is not connected for this company yet, or no container has been picked. Do NOT send the user to Settings \u2014 call the `request_connection` tool with { platform: "google-tag-manager", reason } and they connect and pick their containers (they can pick more than one) from inside the chat. `request_tag_input` is NOT the route: that form manages the container snippet on the site, not what runs inside the container, and it cannot pick a container. If `request_connection` is not available to you, say so plainly and point them at dashboard \u2192 Brain \u2192 Integrations \u2192 Tools \u2192 Google Tag Manager, where they also pick the container. Carry on with the rest of the task meanwhile.'