@koda-sl/baker-cli 0.173.1 → 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 = {
@@ -5144,7 +5145,9 @@ var GOOGLE_ADS_LIMITS = {
5144
5145
  sitelinkLinkTextMax: 25,
5145
5146
  sitelinkDescriptionMax: 35,
5146
5147
  calloutTextMax: 25,
5147
- 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.
5148
5151
  structuredSnippetValuesMin: 3,
5149
5152
  structuredSnippetValuesMax: 10
5150
5153
  },
@@ -5324,6 +5327,500 @@ var LANGUAGE_CONSTANT_REGEX = /^languageConstants\/\d+$/;
5324
5327
 
5325
5328
  // ../api/src/ads-google/ops.ts
5326
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
5327
5824
  var tempRefSchema2 = z15.string().regex(TEMP_REF_REGEX2, "expected a g_temp_* reference");
5328
5825
  var refSchema = z15.union([
5329
5826
  z15.string().regex(RESOURCE_NAME_REGEX, "expected a customers/\u2026/\u2026/\u2026 resource name"),
@@ -5625,9 +6122,20 @@ var calloutAssetSchema = z15.object({
5625
6122
  type: z15.literal("callout"),
5626
6123
  calloutText: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax)
5627
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
+ });
5628
6136
  var structuredSnippetAssetSchema = z15.object({
5629
6137
  type: z15.literal("structuredSnippet"),
5630
- header: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetHeaderMax),
6138
+ header: structuredSnippetHeaderSchema,
5631
6139
  values: z15.array(z15.string().min(1)).min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax)
5632
6140
  });
5633
6141
  var callToActionAssetSchema = z15.object({ type: z15.literal("callToAction"), callToAction: z15.string().min(1) });
@@ -5647,7 +6155,7 @@ var assetUpdateSchema = z15.object({
5647
6155
  description2: z15.string().max(GOOGLE_ADS_LIMITS.asset.sitelinkDescriptionMax).optional(),
5648
6156
  finalUrls: z15.array(httpsUrlSchema2).min(1).optional(),
5649
6157
  calloutText: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.calloutTextMax).optional(),
5650
- header: z15.string().min(1).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetHeaderMax).optional(),
6158
+ header: structuredSnippetHeaderSchema.optional(),
5651
6159
  values: z15.array(z15.string().min(1)).min(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMin).max(GOOGLE_ADS_LIMITS.asset.structuredSnippetValuesMax).optional(),
5652
6160
  callToAction: z15.string().min(1).optional(),
5653
6161
  text: z15.string().min(1).optional()
@@ -10207,10 +10715,7 @@ import { readFileSync as readFileSync4 } from "fs";
10207
10715
  var DAY_MS2 = 864e5;
10208
10716
  function handleLinkedinError(err) {
10209
10717
  if (err instanceof ApiError) {
10210
- if (err.code === "UNAUTHORIZED") {
10211
- handleConnectionError("linkedin_ads", err.message);
10212
- }
10213
- if (err.code === "NOT_FOUND") {
10718
+ if (needsConnectionFix(err.code, err.message)) {
10214
10719
  handleConnectionError("linkedin_ads", err.message);
10215
10720
  }
10216
10721
  if (isNoAccountsSelectedError(err.code, err.message)) {
@@ -15600,10 +16105,10 @@ function duplicateCommand2(entity, label) {
15600
16105
  replace: { type: "boolean", description: "Pause the original once the copy publishes" }
15601
16106
  },
15602
16107
  run: async ({ args }) => {
15603
- const { apiPost: apiPost2 } = await import("./client-R5ZSVIK3.js");
16108
+ const { apiPost: apiPost2 } = await import("./client-XRQWOADV.js");
15604
16109
  const { requireChatId: requireChatId2 } = await import("./env-3JMYIH25.js");
15605
- const { writeJsonEnvelope: writeJsonEnvelope2 } = await import("./output-KLK2GZXR.js");
15606
- 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");
15607
16112
  try {
15608
16113
  const accountId = bareAccountId2(args);
15609
16114
  const chatId = requireChatId2();
@@ -16482,16 +16987,27 @@ async function runList(args) {
16482
16987
  const accountId = resolveAccountIdArg(args);
16483
16988
  const params = { "account-id": accountId };
16484
16989
  if (args["skip-cache"]) params["skip-cache"] = "true";
16485
- const data = await apiGet("/api/ads/meta/pixels", params);
16486
- emit(data, args);
16990
+ const { pixels, restrictedFields } = await apiGet("/api/ads/meta/pixels", params);
16991
+ emit(pixels, args, pixelWarnings(restrictedFields));
16992
+ }
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
+ ];
16487
17003
  }
16488
- function emit(data, args) {
17004
+ function emit(data, args, warnings = []) {
16489
17005
  const fmt = csvOrJson(args);
16490
17006
  if (fmt !== "json") {
16491
17007
  writeAdsOutput(data, fmt);
16492
17008
  return;
16493
17009
  }
16494
- writeAdsJson({ ok: true, data });
17010
+ writeAdsJson({ ok: true, data, ...warnings.length > 0 ? { warnings } : {} });
16495
17011
  }
16496
17012
 
16497
17013
  // src/commands/ads/meta/preview.ts
@@ -16656,7 +17172,7 @@ function accountHints4(accounts) {
16656
17172
  }
16657
17173
  function handleAccountsError2(err) {
16658
17174
  if (err instanceof ApiError) {
16659
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
17175
+ if (needsConnectionFix(err.code, err.message)) {
16660
17176
  handleConnectionError("x_ads", err.message);
16661
17177
  }
16662
17178
  const envelope = {
@@ -16831,7 +17347,7 @@ ${list}`
16831
17347
  });
16832
17348
  process.exit(1);
16833
17349
  } catch (err) {
16834
- if (err instanceof ApiError && (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND")) {
17350
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
16835
17351
  handleConnectionError("x_ads", err.message);
16836
17352
  }
16837
17353
  writeAdsJson({
@@ -26013,7 +26529,7 @@ ${list}`
26013
26529
  });
26014
26530
  process.exit(1);
26015
26531
  } catch (err) {
26016
- if (err instanceof ApiError && (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND")) {
26532
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
26017
26533
  handleConnectionError("ga4", err.message);
26018
26534
  }
26019
26535
  writeJsonEnvelope({
@@ -26142,7 +26658,7 @@ Examples:
26142
26658
  writeJsonEnvelope({ ok: true, data, hints: propertyHints(data) });
26143
26659
  } catch (err) {
26144
26660
  if (err instanceof ApiError) {
26145
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
26661
+ if (needsConnectionFix(err.code, err.message)) {
26146
26662
  handleConnectionError("ga4", err.message);
26147
26663
  }
26148
26664
  writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
@@ -26470,7 +26986,7 @@ ${list}`
26470
26986
  });
26471
26987
  process.exit(1);
26472
26988
  } catch (err) {
26473
- if (err instanceof ApiError && (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND")) {
26989
+ if (err instanceof ApiError && needsConnectionFix(err.code, err.message)) {
26474
26990
  handleConnectionError("gsc", err.message);
26475
26991
  }
26476
26992
  writeJsonEnvelope({
@@ -26777,7 +27293,7 @@ Examples:
26777
27293
  writeJsonEnvelope({ ok: true, data, hints: siteHints(data) });
26778
27294
  } catch (err) {
26779
27295
  if (err instanceof ApiError) {
26780
- if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
27296
+ if (needsConnectionFix(err.code, err.message)) {
26781
27297
  handleConnectionError("gsc", err.message);
26782
27298
  }
26783
27299
  writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
@@ -26928,7 +27444,7 @@ Full guide: __tooling__/docs/tools/baker/history.md`
26928
27444
  import { defineCommand as defineCommand114 } from "citty";
26929
27445
  var EMBED_TYPES = ["legacy", "v4", "unknown"];
26930
27446
  function failNotConnected(err) {
26931
- 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)) {
26932
27448
  writeJson({
26933
27449
  ok: false,
26934
27450
  error: {
@@ -33267,7 +33783,7 @@ function handleError3(err) {
33267
33783
  error: {
33268
33784
  code: err.code,
33269
33785
  message: err.message,
33270
- ...err.code === "UNAUTHORIZED" ? {
33786
+ ...err.code === "UNAUTHORIZED" || err.code === "FORBIDDEN" && isNotConnectedError(err.code, err.message) ? {
33271
33787
  fix: {
33272
33788
  action: "request_connection",
33273
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.'