@bettercms-ai/mcp 0.19.0 → 0.20.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/dist/index.js CHANGED
@@ -315,6 +315,1970 @@ import { BetterCMS } from "@bettercms-ai/sdk";
315
315
  // src/tools.ts
316
316
  import { z } from "zod";
317
317
  import { BetterCMSError } from "@bettercms-ai/sdk";
318
+
319
+ // ../types/src/layout-lucide-icons.ts
320
+ var LAYOUT_SECTION_ICONS = Object.freeze([
321
+ "LayoutPanelTop",
322
+ "PanelTop",
323
+ "PanelBottom",
324
+ "Menu",
325
+ "Navigation",
326
+ "Megaphone",
327
+ "GalleryHorizontal",
328
+ "Rows3",
329
+ "Grid2X2",
330
+ "FileText",
331
+ "Link",
332
+ "Contact",
333
+ "BadgeInfo",
334
+ "Sparkles",
335
+ "a-arrow-down",
336
+ "a-arrow-up",
337
+ "a-large-small",
338
+ "accessibility",
339
+ "activity",
340
+ "air-vent",
341
+ "airplay",
342
+ "alarm-clock-check",
343
+ "alarm-check",
344
+ "alarm-clock-minus",
345
+ "alarm-minus",
346
+ "alarm-clock-off",
347
+ "alarm-clock-plus",
348
+ "alarm-plus",
349
+ "alarm-clock",
350
+ "alarm-smoke",
351
+ "album",
352
+ "align-center-horizontal",
353
+ "align-center-vertical",
354
+ "align-end-horizontal",
355
+ "align-end-vertical",
356
+ "align-horizontal-distribute-center",
357
+ "align-horizontal-distribute-end",
358
+ "align-horizontal-distribute-start",
359
+ "align-horizontal-justify-center",
360
+ "align-horizontal-justify-end",
361
+ "align-horizontal-justify-start",
362
+ "align-horizontal-space-around",
363
+ "align-horizontal-space-between",
364
+ "align-start-horizontal",
365
+ "align-start-vertical",
366
+ "align-vertical-distribute-center",
367
+ "align-vertical-distribute-end",
368
+ "align-vertical-distribute-start",
369
+ "align-vertical-justify-center",
370
+ "align-vertical-justify-end",
371
+ "align-vertical-justify-start",
372
+ "align-vertical-space-around",
373
+ "align-vertical-space-between",
374
+ "ambulance",
375
+ "ampersand",
376
+ "ampersands",
377
+ "amphora",
378
+ "anchor",
379
+ "angry",
380
+ "annoyed",
381
+ "antenna",
382
+ "anvil",
383
+ "aperture",
384
+ "app-window-mac",
385
+ "app-window",
386
+ "apple",
387
+ "archive-restore",
388
+ "archive-x",
389
+ "archive",
390
+ "armchair",
391
+ "arrow-big-down-dash",
392
+ "arrow-big-down",
393
+ "arrow-big-left-dash",
394
+ "arrow-big-left",
395
+ "arrow-big-right-dash",
396
+ "arrow-big-right",
397
+ "arrow-big-up-dash",
398
+ "arrow-big-up",
399
+ "arrow-down-0-1",
400
+ "arrow-down-01",
401
+ "arrow-down-1-0",
402
+ "arrow-down-10",
403
+ "arrow-down-a-z",
404
+ "arrow-down-az",
405
+ "arrow-down-from-line",
406
+ "arrow-down-left",
407
+ "arrow-down-narrow-wide",
408
+ "arrow-down-right",
409
+ "arrow-down-to-dot",
410
+ "arrow-down-to-line",
411
+ "arrow-down-up",
412
+ "arrow-down-wide-narrow",
413
+ "sort-desc",
414
+ "arrow-down-z-a",
415
+ "arrow-down-za",
416
+ "arrow-down",
417
+ "arrow-left-from-line",
418
+ "arrow-left-right",
419
+ "arrow-left-to-line",
420
+ "arrow-left",
421
+ "arrow-right-from-line",
422
+ "arrow-right-left",
423
+ "arrow-right-to-line",
424
+ "arrow-right",
425
+ "arrow-up-0-1",
426
+ "arrow-up-01",
427
+ "arrow-up-1-0",
428
+ "arrow-up-10",
429
+ "arrow-up-a-z",
430
+ "arrow-up-az",
431
+ "arrow-up-down",
432
+ "arrow-up-from-dot",
433
+ "arrow-up-from-line",
434
+ "arrow-up-left",
435
+ "arrow-up-narrow-wide",
436
+ "sort-asc",
437
+ "arrow-up-right",
438
+ "arrow-up-to-line",
439
+ "arrow-up-wide-narrow",
440
+ "arrow-up-z-a",
441
+ "arrow-up-za",
442
+ "arrow-up",
443
+ "arrows-up-from-line",
444
+ "asterisk",
445
+ "at-sign",
446
+ "atom",
447
+ "audio-lines",
448
+ "audio-waveform",
449
+ "award",
450
+ "axe",
451
+ "axis-3d",
452
+ "axis-3-d",
453
+ "baby",
454
+ "backpack",
455
+ "badge-alert",
456
+ "badge-cent",
457
+ "badge-check",
458
+ "verified",
459
+ "badge-dollar-sign",
460
+ "badge-euro",
461
+ "badge-indian-rupee",
462
+ "badge-info",
463
+ "badge-japanese-yen",
464
+ "badge-minus",
465
+ "badge-percent",
466
+ "badge-plus",
467
+ "badge-pound-sterling",
468
+ "badge-question-mark",
469
+ "badge-help",
470
+ "badge-russian-ruble",
471
+ "badge-swiss-franc",
472
+ "badge-turkish-lira",
473
+ "badge-x",
474
+ "badge",
475
+ "baggage-claim",
476
+ "balloon",
477
+ "ban",
478
+ "banana",
479
+ "bandage",
480
+ "banknote-arrow-down",
481
+ "banknote-arrow-up",
482
+ "banknote-x",
483
+ "banknote",
484
+ "barcode",
485
+ "barrel",
486
+ "baseline",
487
+ "bath",
488
+ "battery-charging",
489
+ "battery-full",
490
+ "battery-low",
491
+ "battery-medium",
492
+ "battery-plus",
493
+ "battery-warning",
494
+ "battery",
495
+ "beaker",
496
+ "bean-off",
497
+ "bean",
498
+ "bed-double",
499
+ "bed-single",
500
+ "bed",
501
+ "beef-off",
502
+ "beef",
503
+ "beer-off",
504
+ "beer",
505
+ "bell-dot",
506
+ "bell-electric",
507
+ "bell-minus",
508
+ "bell-off",
509
+ "bell-plus",
510
+ "bell-ring",
511
+ "bell",
512
+ "between-horizontal-end",
513
+ "between-horizonal-end",
514
+ "between-horizontal-start",
515
+ "between-horizonal-start",
516
+ "between-vertical-end",
517
+ "between-vertical-start",
518
+ "biceps-flexed",
519
+ "bike",
520
+ "binary",
521
+ "binoculars",
522
+ "biohazard",
523
+ "bird",
524
+ "birdhouse",
525
+ "bitcoin",
526
+ "blend",
527
+ "blinds",
528
+ "blocks",
529
+ "bluetooth-connected",
530
+ "bluetooth-off",
531
+ "bluetooth-searching",
532
+ "bluetooth",
533
+ "bold",
534
+ "bolt",
535
+ "bomb",
536
+ "bone",
537
+ "book-a",
538
+ "book-alert",
539
+ "book-audio",
540
+ "book-check",
541
+ "book-copy",
542
+ "book-dashed",
543
+ "book-template",
544
+ "book-down",
545
+ "book-headphones",
546
+ "book-heart",
547
+ "book-image",
548
+ "book-key",
549
+ "book-lock",
550
+ "book-marked",
551
+ "book-minus",
552
+ "book-open-check",
553
+ "book-open-text",
554
+ "book-open",
555
+ "book-plus",
556
+ "book-search",
557
+ "book-text",
558
+ "book-type",
559
+ "book-up-2",
560
+ "book-up",
561
+ "book-user",
562
+ "book-x",
563
+ "book",
564
+ "bookmark-check",
565
+ "bookmark-minus",
566
+ "bookmark-off",
567
+ "bookmark-plus",
568
+ "bookmark-x",
569
+ "bookmark",
570
+ "boom-box",
571
+ "bot-message-square",
572
+ "bot-off",
573
+ "bot",
574
+ "bottle-wine",
575
+ "bow-arrow",
576
+ "box",
577
+ "boxes",
578
+ "braces",
579
+ "curly-braces",
580
+ "brackets",
581
+ "brain-circuit",
582
+ "brain-cog",
583
+ "brain",
584
+ "brick-wall-fire",
585
+ "brick-wall-shield",
586
+ "brick-wall",
587
+ "briefcase-business",
588
+ "briefcase-conveyor-belt",
589
+ "briefcase-medical",
590
+ "briefcase",
591
+ "bring-to-front",
592
+ "brush-cleaning",
593
+ "brush",
594
+ "bubbles",
595
+ "bug-off",
596
+ "bug-play",
597
+ "bug",
598
+ "building-2",
599
+ "building",
600
+ "bus-front",
601
+ "bus",
602
+ "cable-car",
603
+ "cable",
604
+ "cake-slice",
605
+ "cake",
606
+ "calculator",
607
+ "calendar-1",
608
+ "calendar-arrow-down",
609
+ "calendar-arrow-up",
610
+ "calendar-check-2",
611
+ "calendar-check",
612
+ "calendar-clock",
613
+ "calendar-cog",
614
+ "calendar-days",
615
+ "calendar-fold",
616
+ "calendar-heart",
617
+ "calendar-minus-2",
618
+ "calendar-minus",
619
+ "calendar-off",
620
+ "calendar-plus-2",
621
+ "calendar-plus",
622
+ "calendar-range",
623
+ "calendar-search",
624
+ "calendar-sync",
625
+ "calendar-x-2",
626
+ "calendar-x",
627
+ "calendar",
628
+ "calendars",
629
+ "camera-off",
630
+ "camera",
631
+ "candy-cane",
632
+ "candy-off",
633
+ "candy",
634
+ "cannabis-off",
635
+ "cannabis",
636
+ "captions-off",
637
+ "captions",
638
+ "subtitles",
639
+ "car-front",
640
+ "car-taxi-front",
641
+ "car",
642
+ "caravan",
643
+ "card-sim",
644
+ "carrot",
645
+ "case-lower",
646
+ "case-sensitive",
647
+ "case-upper",
648
+ "cassette-tape",
649
+ "cast",
650
+ "castle",
651
+ "cat",
652
+ "cctv-off",
653
+ "cctv",
654
+ "chart-area",
655
+ "area-chart",
656
+ "chart-bar-big",
657
+ "bar-chart-horizontal-big",
658
+ "chart-bar-decreasing",
659
+ "chart-bar-increasing",
660
+ "chart-bar-stacked",
661
+ "chart-bar",
662
+ "bar-chart-horizontal",
663
+ "chart-candlestick",
664
+ "candlestick-chart",
665
+ "chart-column-big",
666
+ "bar-chart-big",
667
+ "chart-column-decreasing",
668
+ "chart-column-increasing",
669
+ "bar-chart-4",
670
+ "chart-column-stacked",
671
+ "chart-column",
672
+ "bar-chart-3",
673
+ "chart-gantt",
674
+ "chart-line",
675
+ "line-chart",
676
+ "chart-network",
677
+ "chart-no-axes-column-decreasing",
678
+ "chart-no-axes-column-increasing",
679
+ "bar-chart",
680
+ "chart-no-axes-column",
681
+ "bar-chart-2",
682
+ "chart-no-axes-combined",
683
+ "chart-no-axes-gantt",
684
+ "gantt-chart",
685
+ "chart-pie",
686
+ "pie-chart",
687
+ "chart-scatter",
688
+ "scatter-chart",
689
+ "chart-spline",
690
+ "check-check",
691
+ "check-line",
692
+ "check",
693
+ "chef-hat",
694
+ "cherry",
695
+ "chess-bishop",
696
+ "chess-king",
697
+ "chess-knight",
698
+ "chess-pawn",
699
+ "chess-queen",
700
+ "chess-rook",
701
+ "chevron-down",
702
+ "chevron-first",
703
+ "chevron-last",
704
+ "chevron-left",
705
+ "chevron-right",
706
+ "chevron-up",
707
+ "chevrons-down-up",
708
+ "chevrons-down",
709
+ "chevrons-left-right-ellipsis",
710
+ "chevrons-left-right",
711
+ "chevrons-left",
712
+ "chevrons-right-left",
713
+ "chevrons-right",
714
+ "chevrons-up-down",
715
+ "chevrons-up",
716
+ "church",
717
+ "cigarette-off",
718
+ "cigarette",
719
+ "circle-alert",
720
+ "alert-circle",
721
+ "circle-arrow-down",
722
+ "arrow-down-circle",
723
+ "circle-arrow-left",
724
+ "arrow-left-circle",
725
+ "circle-arrow-out-down-left",
726
+ "arrow-down-left-from-circle",
727
+ "circle-arrow-out-down-right",
728
+ "arrow-down-right-from-circle",
729
+ "circle-arrow-out-up-left",
730
+ "arrow-up-left-from-circle",
731
+ "circle-arrow-out-up-right",
732
+ "arrow-up-right-from-circle",
733
+ "circle-arrow-right",
734
+ "arrow-right-circle",
735
+ "circle-arrow-up",
736
+ "arrow-up-circle",
737
+ "circle-check-big",
738
+ "check-circle",
739
+ "circle-check",
740
+ "check-circle-2",
741
+ "circle-chevron-down",
742
+ "chevron-down-circle",
743
+ "circle-chevron-left",
744
+ "chevron-left-circle",
745
+ "circle-chevron-right",
746
+ "chevron-right-circle",
747
+ "circle-chevron-up",
748
+ "chevron-up-circle",
749
+ "circle-dashed",
750
+ "circle-divide",
751
+ "divide-circle",
752
+ "circle-dollar-sign",
753
+ "circle-dot-dashed",
754
+ "circle-dot",
755
+ "circle-ellipsis",
756
+ "circle-equal",
757
+ "circle-fading-arrow-up",
758
+ "circle-fading-plus",
759
+ "circle-gauge",
760
+ "gauge-circle",
761
+ "circle-minus",
762
+ "minus-circle",
763
+ "circle-off",
764
+ "circle-parking-off",
765
+ "parking-circle-off",
766
+ "circle-parking",
767
+ "parking-circle",
768
+ "circle-pause",
769
+ "pause-circle",
770
+ "circle-percent",
771
+ "percent-circle",
772
+ "circle-pile",
773
+ "circle-play",
774
+ "play-circle",
775
+ "circle-plus",
776
+ "plus-circle",
777
+ "circle-pound-sterling",
778
+ "circle-power",
779
+ "power-circle",
780
+ "circle-question-mark",
781
+ "help-circle",
782
+ "circle-help",
783
+ "circle-slash-2",
784
+ "circle-slashed",
785
+ "circle-slash",
786
+ "circle-small",
787
+ "circle-star",
788
+ "circle-stop",
789
+ "stop-circle",
790
+ "circle-user-round",
791
+ "user-circle-2",
792
+ "circle-user",
793
+ "user-circle",
794
+ "circle-x",
795
+ "x-circle",
796
+ "circle",
797
+ "circuit-board",
798
+ "citrus",
799
+ "clapperboard",
800
+ "clipboard-check",
801
+ "clipboard-clock",
802
+ "clipboard-copy",
803
+ "clipboard-list",
804
+ "clipboard-minus",
805
+ "clipboard-paste",
806
+ "clipboard-pen-line",
807
+ "clipboard-signature",
808
+ "clipboard-pen",
809
+ "clipboard-edit",
810
+ "clipboard-plus",
811
+ "clipboard-type",
812
+ "clipboard-x",
813
+ "clipboard",
814
+ "clock-1",
815
+ "clock-10",
816
+ "clock-11",
817
+ "clock-12",
818
+ "clock-2",
819
+ "clock-3",
820
+ "clock-4",
821
+ "clock-5",
822
+ "clock-6",
823
+ "clock-7",
824
+ "clock-8",
825
+ "clock-9",
826
+ "clock-alert",
827
+ "clock-arrow-down",
828
+ "clock-arrow-up",
829
+ "clock-check",
830
+ "clock-fading",
831
+ "clock-plus",
832
+ "clock",
833
+ "closed-caption",
834
+ "cloud-alert",
835
+ "cloud-backup",
836
+ "cloud-check",
837
+ "cloud-cog",
838
+ "cloud-download",
839
+ "download-cloud",
840
+ "cloud-drizzle",
841
+ "cloud-fog",
842
+ "cloud-hail",
843
+ "cloud-lightning",
844
+ "cloud-moon-rain",
845
+ "cloud-moon",
846
+ "cloud-off",
847
+ "cloud-rain-wind",
848
+ "cloud-rain",
849
+ "cloud-snow",
850
+ "cloud-sun-rain",
851
+ "cloud-sun",
852
+ "cloud-sync",
853
+ "cloud-upload",
854
+ "upload-cloud",
855
+ "cloud",
856
+ "cloudy",
857
+ "clover",
858
+ "club",
859
+ "code-xml",
860
+ "code-2",
861
+ "code",
862
+ "coffee",
863
+ "cog",
864
+ "coins",
865
+ "columns-2",
866
+ "columns",
867
+ "columns-3-cog",
868
+ "columns-settings",
869
+ "table-config",
870
+ "columns-3",
871
+ "panels-left-right",
872
+ "columns-4",
873
+ "combine",
874
+ "command",
875
+ "compass",
876
+ "component",
877
+ "computer",
878
+ "concierge-bell",
879
+ "cone",
880
+ "construction",
881
+ "contact-round",
882
+ "contact-2",
883
+ "contact",
884
+ "container",
885
+ "contrast",
886
+ "cookie",
887
+ "cooking-pot",
888
+ "copy-check",
889
+ "copy-minus",
890
+ "copy-plus",
891
+ "copy-slash",
892
+ "copy-x",
893
+ "copy",
894
+ "copyleft",
895
+ "copyright",
896
+ "corner-down-left",
897
+ "corner-down-right",
898
+ "corner-left-down",
899
+ "corner-left-up",
900
+ "corner-right-down",
901
+ "corner-right-up",
902
+ "corner-up-left",
903
+ "corner-up-right",
904
+ "cpu",
905
+ "creative-commons",
906
+ "credit-card",
907
+ "croissant",
908
+ "crop",
909
+ "cross",
910
+ "crosshair",
911
+ "crown",
912
+ "cuboid",
913
+ "cup-soda",
914
+ "currency",
915
+ "cylinder",
916
+ "dam",
917
+ "database-backup",
918
+ "database-search",
919
+ "database-zap",
920
+ "database",
921
+ "decimals-arrow-left",
922
+ "decimals-arrow-right",
923
+ "delete",
924
+ "dessert",
925
+ "diameter",
926
+ "diamond-minus",
927
+ "diamond-percent",
928
+ "percent-diamond",
929
+ "diamond-plus",
930
+ "diamond",
931
+ "dice-1",
932
+ "dice-2",
933
+ "dice-3",
934
+ "dice-4",
935
+ "dice-5",
936
+ "dice-6",
937
+ "dices",
938
+ "diff",
939
+ "disc-2",
940
+ "disc-3",
941
+ "disc-album",
942
+ "disc",
943
+ "divide",
944
+ "dna-off",
945
+ "dna",
946
+ "dock",
947
+ "dog",
948
+ "dollar-sign",
949
+ "donut",
950
+ "door-closed-locked",
951
+ "door-closed",
952
+ "door-open",
953
+ "dot",
954
+ "download",
955
+ "drafting-compass",
956
+ "drama",
957
+ "drill",
958
+ "drone",
959
+ "droplet-off",
960
+ "droplet",
961
+ "droplets",
962
+ "drum",
963
+ "drumstick",
964
+ "dumbbell",
965
+ "ear-off",
966
+ "ear",
967
+ "earth-lock",
968
+ "earth",
969
+ "globe-2",
970
+ "eclipse",
971
+ "egg-fried",
972
+ "egg-off",
973
+ "egg",
974
+ "ellipse",
975
+ "ellipsis-vertical",
976
+ "more-vertical",
977
+ "ellipsis",
978
+ "more-horizontal",
979
+ "equal-approximately",
980
+ "equal-not",
981
+ "equal",
982
+ "eraser",
983
+ "ethernet-port",
984
+ "euro",
985
+ "ev-charger",
986
+ "expand",
987
+ "external-link",
988
+ "eye-closed",
989
+ "eye-off",
990
+ "eye",
991
+ "factory",
992
+ "fan",
993
+ "fast-forward",
994
+ "feather",
995
+ "fence",
996
+ "ferris-wheel",
997
+ "file-archive",
998
+ "file-axis-3d",
999
+ "file-axis-3-d",
1000
+ "file-badge",
1001
+ "file-badge-2",
1002
+ "file-box",
1003
+ "file-braces-corner",
1004
+ "file-json-2",
1005
+ "file-braces",
1006
+ "file-json",
1007
+ "file-chart-column-increasing",
1008
+ "file-bar-chart",
1009
+ "file-chart-column",
1010
+ "file-bar-chart-2",
1011
+ "file-chart-line",
1012
+ "file-line-chart",
1013
+ "file-chart-pie",
1014
+ "file-pie-chart",
1015
+ "file-check-corner",
1016
+ "file-check-2",
1017
+ "file-check",
1018
+ "file-clock",
1019
+ "file-code-corner",
1020
+ "file-code-2",
1021
+ "file-code",
1022
+ "file-cog",
1023
+ "file-cog-2",
1024
+ "file-diff",
1025
+ "file-digit",
1026
+ "file-down",
1027
+ "file-exclamation-point",
1028
+ "file-warning",
1029
+ "file-headphone",
1030
+ "file-audio",
1031
+ "file-audio-2",
1032
+ "file-heart",
1033
+ "file-image",
1034
+ "file-input",
1035
+ "file-key",
1036
+ "file-key-2",
1037
+ "file-lock",
1038
+ "file-lock-2",
1039
+ "file-minus-corner",
1040
+ "file-minus-2",
1041
+ "file-minus",
1042
+ "file-music",
1043
+ "file-output",
1044
+ "file-pen-line",
1045
+ "file-signature",
1046
+ "file-pen",
1047
+ "file-edit",
1048
+ "file-play",
1049
+ "file-video",
1050
+ "file-plus-corner",
1051
+ "file-plus-2",
1052
+ "file-plus",
1053
+ "file-question-mark",
1054
+ "file-question",
1055
+ "file-scan",
1056
+ "file-search-corner",
1057
+ "file-search-2",
1058
+ "file-search",
1059
+ "file-signal",
1060
+ "file-volume-2",
1061
+ "file-sliders",
1062
+ "file-spreadsheet",
1063
+ "file-stack",
1064
+ "file-symlink",
1065
+ "file-terminal",
1066
+ "file-text",
1067
+ "file-type-corner",
1068
+ "file-type-2",
1069
+ "file-type",
1070
+ "file-up",
1071
+ "file-user",
1072
+ "file-video-camera",
1073
+ "file-video-2",
1074
+ "file-volume",
1075
+ "file-x-corner",
1076
+ "file-x-2",
1077
+ "file-x",
1078
+ "file",
1079
+ "files",
1080
+ "film",
1081
+ "fingerprint-pattern",
1082
+ "fingerprint",
1083
+ "fire-extinguisher",
1084
+ "fish-off",
1085
+ "fish-symbol",
1086
+ "fish",
1087
+ "fishing-hook",
1088
+ "fishing-rod",
1089
+ "flag-off",
1090
+ "flag-triangle-left",
1091
+ "flag-triangle-right",
1092
+ "flag",
1093
+ "flame-kindling",
1094
+ "flame",
1095
+ "flashlight-off",
1096
+ "flashlight",
1097
+ "flask-conical-off",
1098
+ "flask-conical",
1099
+ "flask-round",
1100
+ "flip-horizontal-2",
1101
+ "flip-vertical-2",
1102
+ "flower-2",
1103
+ "flower",
1104
+ "focus",
1105
+ "fold-horizontal",
1106
+ "fold-vertical",
1107
+ "folder-archive",
1108
+ "folder-check",
1109
+ "folder-clock",
1110
+ "folder-closed",
1111
+ "folder-code",
1112
+ "folder-cog",
1113
+ "folder-cog-2",
1114
+ "folder-dot",
1115
+ "folder-down",
1116
+ "folder-git-2",
1117
+ "folder-git",
1118
+ "folder-heart",
1119
+ "folder-input",
1120
+ "folder-kanban",
1121
+ "folder-key",
1122
+ "folder-lock",
1123
+ "folder-minus",
1124
+ "folder-open-dot",
1125
+ "folder-open",
1126
+ "folder-output",
1127
+ "folder-pen",
1128
+ "folder-edit",
1129
+ "folder-plus",
1130
+ "folder-root",
1131
+ "folder-search-2",
1132
+ "folder-search",
1133
+ "folder-symlink",
1134
+ "folder-sync",
1135
+ "folder-tree",
1136
+ "folder-up",
1137
+ "folder-x",
1138
+ "folder",
1139
+ "folders",
1140
+ "footprints",
1141
+ "forklift",
1142
+ "form",
1143
+ "forward",
1144
+ "frame",
1145
+ "frown",
1146
+ "fuel",
1147
+ "fullscreen",
1148
+ "funnel-plus",
1149
+ "funnel-x",
1150
+ "filter-x",
1151
+ "funnel",
1152
+ "filter",
1153
+ "gallery-horizontal-end",
1154
+ "gallery-horizontal",
1155
+ "gallery-thumbnails",
1156
+ "gallery-vertical-end",
1157
+ "gallery-vertical",
1158
+ "gamepad-2",
1159
+ "gamepad-directional",
1160
+ "gamepad",
1161
+ "gauge",
1162
+ "gavel",
1163
+ "gem",
1164
+ "georgian-lari",
1165
+ "ghost",
1166
+ "gift",
1167
+ "git-branch-minus",
1168
+ "git-branch-plus",
1169
+ "git-branch",
1170
+ "git-commit-horizontal",
1171
+ "git-commit",
1172
+ "git-commit-vertical",
1173
+ "git-compare-arrows",
1174
+ "git-compare",
1175
+ "git-fork",
1176
+ "git-graph",
1177
+ "git-merge-conflict",
1178
+ "git-merge",
1179
+ "git-pull-request-arrow",
1180
+ "git-pull-request-closed",
1181
+ "git-pull-request-create-arrow",
1182
+ "git-pull-request-create",
1183
+ "git-pull-request-draft",
1184
+ "git-pull-request",
1185
+ "glass-water",
1186
+ "glasses",
1187
+ "globe-lock",
1188
+ "globe-off",
1189
+ "globe-x",
1190
+ "globe",
1191
+ "goal",
1192
+ "gpu",
1193
+ "graduation-cap",
1194
+ "grape",
1195
+ "grid-2x2-check",
1196
+ "grid-2-x-2-check",
1197
+ "grid-2x2-plus",
1198
+ "grid-2-x-2-plus",
1199
+ "grid-2x2-x",
1200
+ "grid-2-x-2-x",
1201
+ "grid-2x2",
1202
+ "grid-2-x-2",
1203
+ "grid-3x2",
1204
+ "grid-3x3",
1205
+ "grid",
1206
+ "grid-3-x-3",
1207
+ "grip-horizontal",
1208
+ "grip-vertical",
1209
+ "grip",
1210
+ "group",
1211
+ "guitar",
1212
+ "ham",
1213
+ "hamburger",
1214
+ "hammer",
1215
+ "hand-coins",
1216
+ "hand-fist",
1217
+ "hand-grab",
1218
+ "grab",
1219
+ "hand-heart",
1220
+ "hand-helping",
1221
+ "helping-hand",
1222
+ "hand-metal",
1223
+ "hand-platter",
1224
+ "hand",
1225
+ "handbag",
1226
+ "handshake",
1227
+ "hard-drive-download",
1228
+ "hard-drive-upload",
1229
+ "hard-drive",
1230
+ "hard-hat",
1231
+ "hash",
1232
+ "hat-glasses",
1233
+ "haze",
1234
+ "hd",
1235
+ "hdmi-port",
1236
+ "heading-1",
1237
+ "heading-2",
1238
+ "heading-3",
1239
+ "heading-4",
1240
+ "heading-5",
1241
+ "heading-6",
1242
+ "heading",
1243
+ "headphone-off",
1244
+ "headphones",
1245
+ "headset",
1246
+ "heart-crack",
1247
+ "heart-handshake",
1248
+ "heart-minus",
1249
+ "heart-off",
1250
+ "heart-plus",
1251
+ "heart-pulse",
1252
+ "heart",
1253
+ "heater",
1254
+ "helicopter",
1255
+ "hexagon",
1256
+ "highlighter",
1257
+ "history",
1258
+ "hop-off",
1259
+ "hop",
1260
+ "hospital",
1261
+ "hotel",
1262
+ "hourglass",
1263
+ "house-heart",
1264
+ "house-plug",
1265
+ "house-plus",
1266
+ "house-wifi",
1267
+ "house",
1268
+ "home",
1269
+ "ice-cream-bowl",
1270
+ "ice-cream-2",
1271
+ "ice-cream-cone",
1272
+ "ice-cream",
1273
+ "id-card-lanyard",
1274
+ "id-card",
1275
+ "image-down",
1276
+ "image-minus",
1277
+ "image-off",
1278
+ "image-play",
1279
+ "image-plus",
1280
+ "image-up",
1281
+ "image-upscale",
1282
+ "image",
1283
+ "images",
1284
+ "import",
1285
+ "inbox",
1286
+ "indian-rupee",
1287
+ "infinity",
1288
+ "info",
1289
+ "inspection-panel",
1290
+ "italic",
1291
+ "iteration-ccw",
1292
+ "iteration-cw",
1293
+ "japanese-yen",
1294
+ "joystick",
1295
+ "kanban",
1296
+ "kayak",
1297
+ "key-round",
1298
+ "key-square",
1299
+ "key",
1300
+ "keyboard-music",
1301
+ "keyboard-off",
1302
+ "keyboard",
1303
+ "lamp-ceiling",
1304
+ "lamp-desk",
1305
+ "lamp-floor",
1306
+ "lamp-wall-down",
1307
+ "lamp-wall-up",
1308
+ "lamp",
1309
+ "land-plot",
1310
+ "landmark",
1311
+ "languages",
1312
+ "laptop-minimal-check",
1313
+ "laptop-minimal",
1314
+ "laptop-2",
1315
+ "laptop",
1316
+ "lasso-select",
1317
+ "lasso",
1318
+ "laugh",
1319
+ "layers-2",
1320
+ "layers-plus",
1321
+ "layers",
1322
+ "layers-3",
1323
+ "layout-dashboard",
1324
+ "layout-grid",
1325
+ "layout-list",
1326
+ "layout-panel-left",
1327
+ "layout-panel-top",
1328
+ "layout-template",
1329
+ "leaf",
1330
+ "leafy-green",
1331
+ "lectern",
1332
+ "lens-concave",
1333
+ "lens-convex",
1334
+ "library-big",
1335
+ "library",
1336
+ "life-buoy",
1337
+ "ligature",
1338
+ "lightbulb-off",
1339
+ "lightbulb",
1340
+ "line-dot-right-horizontal",
1341
+ "line-squiggle",
1342
+ "line-style",
1343
+ "link-2-off",
1344
+ "link-2",
1345
+ "link",
1346
+ "list-check",
1347
+ "list-checks",
1348
+ "list-chevrons-down-up",
1349
+ "list-chevrons-up-down",
1350
+ "list-collapse",
1351
+ "list-end",
1352
+ "list-filter-plus",
1353
+ "list-filter",
1354
+ "list-indent-decrease",
1355
+ "outdent",
1356
+ "indent-decrease",
1357
+ "list-indent-increase",
1358
+ "indent",
1359
+ "indent-increase",
1360
+ "list-minus",
1361
+ "list-music",
1362
+ "list-ordered",
1363
+ "list-plus",
1364
+ "list-restart",
1365
+ "list-start",
1366
+ "list-todo",
1367
+ "list-tree",
1368
+ "list-video",
1369
+ "list-x",
1370
+ "list",
1371
+ "loader-circle",
1372
+ "loader-2",
1373
+ "loader-pinwheel",
1374
+ "loader",
1375
+ "locate-fixed",
1376
+ "locate-off",
1377
+ "locate",
1378
+ "lock-keyhole-open",
1379
+ "unlock-keyhole",
1380
+ "lock-keyhole",
1381
+ "lock-open",
1382
+ "unlock",
1383
+ "lock",
1384
+ "log-in",
1385
+ "log-out",
1386
+ "logs",
1387
+ "lollipop",
1388
+ "luggage",
1389
+ "magnet",
1390
+ "mail-check",
1391
+ "mail-minus",
1392
+ "mail-open",
1393
+ "mail-plus",
1394
+ "mail-question-mark",
1395
+ "mail-question",
1396
+ "mail-search",
1397
+ "mail-warning",
1398
+ "mail-x",
1399
+ "mail",
1400
+ "mailbox",
1401
+ "mails",
1402
+ "map-minus",
1403
+ "map-pin-check-inside",
1404
+ "map-pin-check",
1405
+ "map-pin-house",
1406
+ "map-pin-minus-inside",
1407
+ "map-pin-minus",
1408
+ "map-pin-off",
1409
+ "map-pin-pen",
1410
+ "location-edit",
1411
+ "map-pin-plus-inside",
1412
+ "map-pin-plus",
1413
+ "map-pin-search",
1414
+ "map-pin-x-inside",
1415
+ "map-pin-x",
1416
+ "map-pin",
1417
+ "map-pinned",
1418
+ "map-plus",
1419
+ "map",
1420
+ "mars-stroke",
1421
+ "mars",
1422
+ "martini",
1423
+ "maximize-2",
1424
+ "maximize",
1425
+ "medal",
1426
+ "megaphone-off",
1427
+ "megaphone",
1428
+ "meh",
1429
+ "memory-stick",
1430
+ "menu",
1431
+ "merge",
1432
+ "message-circle-check",
1433
+ "message-circle-code",
1434
+ "message-circle-dashed",
1435
+ "message-circle-heart",
1436
+ "message-circle-more",
1437
+ "message-circle-off",
1438
+ "message-circle-plus",
1439
+ "message-circle-question-mark",
1440
+ "message-circle-question",
1441
+ "message-circle-reply",
1442
+ "message-circle-warning",
1443
+ "message-circle-x",
1444
+ "message-circle",
1445
+ "message-square-check",
1446
+ "message-square-code",
1447
+ "message-square-dashed",
1448
+ "message-square-diff",
1449
+ "message-square-dot",
1450
+ "message-square-heart",
1451
+ "message-square-lock",
1452
+ "message-square-more",
1453
+ "message-square-off",
1454
+ "message-square-plus",
1455
+ "message-square-quote",
1456
+ "message-square-reply",
1457
+ "message-square-share",
1458
+ "message-square-text",
1459
+ "message-square-warning",
1460
+ "message-square-x",
1461
+ "message-square",
1462
+ "messages-square",
1463
+ "metronome",
1464
+ "mic-off",
1465
+ "mic-vocal",
1466
+ "mic-2",
1467
+ "mic",
1468
+ "microchip",
1469
+ "microscope",
1470
+ "microwave",
1471
+ "milestone",
1472
+ "milk-off",
1473
+ "milk",
1474
+ "minimize-2",
1475
+ "minimize",
1476
+ "minus",
1477
+ "mirror-rectangular",
1478
+ "mirror-round",
1479
+ "monitor-check",
1480
+ "monitor-cloud",
1481
+ "monitor-cog",
1482
+ "monitor-dot",
1483
+ "monitor-down",
1484
+ "monitor-off",
1485
+ "monitor-pause",
1486
+ "monitor-play",
1487
+ "monitor-smartphone",
1488
+ "monitor-speaker",
1489
+ "monitor-stop",
1490
+ "monitor-up",
1491
+ "monitor-x",
1492
+ "monitor",
1493
+ "moon-star",
1494
+ "moon",
1495
+ "motorbike",
1496
+ "mountain-snow",
1497
+ "mountain",
1498
+ "mouse-left",
1499
+ "mouse-off",
1500
+ "mouse-pointer-2-off",
1501
+ "mouse-pointer-2",
1502
+ "mouse-pointer-ban",
1503
+ "mouse-pointer-click",
1504
+ "mouse-pointer",
1505
+ "mouse-right",
1506
+ "mouse",
1507
+ "move-3d",
1508
+ "move-3-d",
1509
+ "move-diagonal-2",
1510
+ "move-diagonal",
1511
+ "move-down-left",
1512
+ "move-down-right",
1513
+ "move-down",
1514
+ "move-horizontal",
1515
+ "move-left",
1516
+ "move-right",
1517
+ "move-up-left",
1518
+ "move-up-right",
1519
+ "move-up",
1520
+ "move-vertical",
1521
+ "move",
1522
+ "music-2",
1523
+ "music-3",
1524
+ "music-4",
1525
+ "music",
1526
+ "navigation-2-off",
1527
+ "navigation-2",
1528
+ "navigation-off",
1529
+ "navigation",
1530
+ "network",
1531
+ "newspaper",
1532
+ "nfc",
1533
+ "non-binary",
1534
+ "notebook-pen",
1535
+ "notebook-tabs",
1536
+ "notebook-text",
1537
+ "notebook",
1538
+ "notepad-text-dashed",
1539
+ "notepad-text",
1540
+ "nut-off",
1541
+ "nut",
1542
+ "octagon-alert",
1543
+ "alert-octagon",
1544
+ "octagon-minus",
1545
+ "octagon-pause",
1546
+ "pause-octagon",
1547
+ "octagon-x",
1548
+ "x-octagon",
1549
+ "octagon",
1550
+ "omega",
1551
+ "option",
1552
+ "orbit",
1553
+ "origami",
1554
+ "package-2",
1555
+ "package-check",
1556
+ "package-minus",
1557
+ "package-open",
1558
+ "package-plus",
1559
+ "package-search",
1560
+ "package-x",
1561
+ "package",
1562
+ "paint-bucket",
1563
+ "paint-roller",
1564
+ "paintbrush-vertical",
1565
+ "paintbrush-2",
1566
+ "paintbrush",
1567
+ "palette",
1568
+ "panda",
1569
+ "panel-bottom-close",
1570
+ "panel-bottom-dashed",
1571
+ "panel-bottom-inactive",
1572
+ "panel-bottom-open",
1573
+ "panel-bottom",
1574
+ "panel-left-close",
1575
+ "sidebar-close",
1576
+ "panel-left-dashed",
1577
+ "panel-left-inactive",
1578
+ "panel-left-open",
1579
+ "sidebar-open",
1580
+ "panel-left-right-dashed",
1581
+ "panel-left",
1582
+ "sidebar",
1583
+ "panel-right-close",
1584
+ "panel-right-dashed",
1585
+ "panel-right-inactive",
1586
+ "panel-right-open",
1587
+ "panel-right",
1588
+ "panel-top-bottom-dashed",
1589
+ "panel-top-close",
1590
+ "panel-top-dashed",
1591
+ "panel-top-inactive",
1592
+ "panel-top-open",
1593
+ "panel-top",
1594
+ "panels-left-bottom",
1595
+ "panels-right-bottom",
1596
+ "panels-top-left",
1597
+ "layout",
1598
+ "paperclip",
1599
+ "parentheses",
1600
+ "parking-meter",
1601
+ "party-popper",
1602
+ "pause",
1603
+ "paw-print",
1604
+ "pc-case",
1605
+ "pen-line",
1606
+ "edit-3",
1607
+ "pen-off",
1608
+ "pen-tool",
1609
+ "pen",
1610
+ "edit-2",
1611
+ "pencil-line",
1612
+ "pencil-off",
1613
+ "pencil-ruler",
1614
+ "pencil",
1615
+ "pentagon",
1616
+ "percent",
1617
+ "person-standing",
1618
+ "philippine-peso",
1619
+ "phone-call",
1620
+ "phone-forwarded",
1621
+ "phone-incoming",
1622
+ "phone-missed",
1623
+ "phone-off",
1624
+ "phone-outgoing",
1625
+ "phone",
1626
+ "pi",
1627
+ "piano",
1628
+ "pickaxe",
1629
+ "picture-in-picture-2",
1630
+ "picture-in-picture",
1631
+ "piggy-bank",
1632
+ "pilcrow-left",
1633
+ "pilcrow-right",
1634
+ "pilcrow",
1635
+ "pill-bottle",
1636
+ "pill",
1637
+ "pin-off",
1638
+ "pin",
1639
+ "pipette",
1640
+ "pizza",
1641
+ "plane-landing",
1642
+ "plane-takeoff",
1643
+ "plane",
1644
+ "play",
1645
+ "plug-2",
1646
+ "plug-zap",
1647
+ "plug-zap-2",
1648
+ "plug",
1649
+ "plus",
1650
+ "pocket-knife",
1651
+ "podcast",
1652
+ "pointer-off",
1653
+ "pointer",
1654
+ "popcorn",
1655
+ "popsicle",
1656
+ "pound-sterling",
1657
+ "power-off",
1658
+ "power",
1659
+ "presentation",
1660
+ "printer-check",
1661
+ "printer-x",
1662
+ "printer",
1663
+ "projector",
1664
+ "proportions",
1665
+ "puzzle",
1666
+ "pyramid",
1667
+ "qr-code",
1668
+ "quote",
1669
+ "rabbit",
1670
+ "radar",
1671
+ "radiation",
1672
+ "radical",
1673
+ "radio-off",
1674
+ "radio-receiver",
1675
+ "radio-tower",
1676
+ "radio",
1677
+ "radius",
1678
+ "rainbow",
1679
+ "rat",
1680
+ "ratio",
1681
+ "receipt-cent",
1682
+ "receipt-euro",
1683
+ "receipt-indian-rupee",
1684
+ "receipt-japanese-yen",
1685
+ "receipt-pound-sterling",
1686
+ "receipt-russian-ruble",
1687
+ "receipt-swiss-franc",
1688
+ "receipt-text",
1689
+ "receipt-turkish-lira",
1690
+ "receipt",
1691
+ "rectangle-circle",
1692
+ "rectangle-ellipsis",
1693
+ "form-input",
1694
+ "rectangle-goggles",
1695
+ "rectangle-horizontal",
1696
+ "rectangle-vertical",
1697
+ "recycle",
1698
+ "redo-2",
1699
+ "redo-dot",
1700
+ "redo",
1701
+ "refresh-ccw-dot",
1702
+ "refresh-ccw",
1703
+ "refresh-cw-off",
1704
+ "refresh-cw",
1705
+ "refrigerator",
1706
+ "regex",
1707
+ "remove-formatting",
1708
+ "repeat-1",
1709
+ "repeat-2",
1710
+ "repeat",
1711
+ "replace-all",
1712
+ "replace",
1713
+ "reply-all",
1714
+ "reply",
1715
+ "rewind",
1716
+ "ribbon",
1717
+ "road",
1718
+ "rocket",
1719
+ "rocking-chair",
1720
+ "roller-coaster",
1721
+ "rose",
1722
+ "rotate-3d",
1723
+ "rotate-3-d",
1724
+ "rotate-ccw-key",
1725
+ "rotate-ccw-square",
1726
+ "rotate-ccw",
1727
+ "rotate-cw-square",
1728
+ "rotate-cw",
1729
+ "route-off",
1730
+ "route",
1731
+ "router",
1732
+ "rows-2",
1733
+ "rows",
1734
+ "rows-3",
1735
+ "panels-top-bottom",
1736
+ "rows-4",
1737
+ "rss",
1738
+ "ruler-dimension-line",
1739
+ "ruler",
1740
+ "russian-ruble",
1741
+ "sailboat",
1742
+ "salad",
1743
+ "sandwich",
1744
+ "satellite-dish",
1745
+ "satellite",
1746
+ "saudi-riyal",
1747
+ "save-all",
1748
+ "save-off",
1749
+ "save",
1750
+ "scale-3d",
1751
+ "scale-3-d",
1752
+ "scale",
1753
+ "scaling",
1754
+ "scan-barcode",
1755
+ "scan-eye",
1756
+ "scan-face",
1757
+ "scan-heart",
1758
+ "scan-line",
1759
+ "scan-qr-code",
1760
+ "scan-search",
1761
+ "scan-text",
1762
+ "scan",
1763
+ "school",
1764
+ "scissors-line-dashed",
1765
+ "scissors",
1766
+ "scooter",
1767
+ "screen-share-off",
1768
+ "screen-share",
1769
+ "scroll-text",
1770
+ "scroll",
1771
+ "search-alert",
1772
+ "search-check",
1773
+ "search-code",
1774
+ "search-slash",
1775
+ "search-x",
1776
+ "search",
1777
+ "section",
1778
+ "send-horizontal",
1779
+ "send-horizonal",
1780
+ "send-to-back",
1781
+ "send",
1782
+ "separator-horizontal",
1783
+ "separator-vertical",
1784
+ "server-cog",
1785
+ "server-crash",
1786
+ "server-off",
1787
+ "server",
1788
+ "settings-2",
1789
+ "settings",
1790
+ "shapes",
1791
+ "share-2",
1792
+ "share",
1793
+ "sheet",
1794
+ "shell",
1795
+ "shelving-unit",
1796
+ "shield-alert",
1797
+ "shield-ban",
1798
+ "shield-check",
1799
+ "shield-cog-corner",
1800
+ "shield-cog",
1801
+ "shield-ellipsis",
1802
+ "shield-half",
1803
+ "shield-minus",
1804
+ "shield-off",
1805
+ "shield-plus",
1806
+ "shield-question-mark",
1807
+ "shield-question",
1808
+ "shield-user",
1809
+ "shield-x",
1810
+ "shield-close",
1811
+ "shield",
1812
+ "ship-wheel",
1813
+ "ship",
1814
+ "shirt",
1815
+ "shopping-bag",
1816
+ "shopping-basket",
1817
+ "shopping-cart",
1818
+ "shovel",
1819
+ "shower-head",
1820
+ "shredder",
1821
+ "shrimp",
1822
+ "shrink",
1823
+ "shrub",
1824
+ "shuffle",
1825
+ "sigma",
1826
+ "signal-high",
1827
+ "signal-low",
1828
+ "signal-medium",
1829
+ "signal-zero",
1830
+ "signal",
1831
+ "signature",
1832
+ "signpost-big",
1833
+ "signpost",
1834
+ "siren",
1835
+ "skip-back",
1836
+ "skip-forward",
1837
+ "skull",
1838
+ "slash",
1839
+ "slice",
1840
+ "sliders-horizontal",
1841
+ "sliders-vertical",
1842
+ "sliders",
1843
+ "smartphone-charging",
1844
+ "smartphone-nfc",
1845
+ "smartphone",
1846
+ "smile-plus",
1847
+ "smile",
1848
+ "snail",
1849
+ "snowflake",
1850
+ "soap-dispenser-droplet",
1851
+ "sofa",
1852
+ "solar-panel",
1853
+ "soup",
1854
+ "space",
1855
+ "spade",
1856
+ "sparkle",
1857
+ "sparkles",
1858
+ "stars",
1859
+ "speaker",
1860
+ "speech",
1861
+ "spell-check-2",
1862
+ "spell-check",
1863
+ "spline-pointer",
1864
+ "spline",
1865
+ "split",
1866
+ "spool",
1867
+ "sport-shoe",
1868
+ "spotlight",
1869
+ "spray-can",
1870
+ "sprout",
1871
+ "square-activity",
1872
+ "activity-square",
1873
+ "square-arrow-down-left",
1874
+ "arrow-down-left-square",
1875
+ "square-arrow-down-right",
1876
+ "arrow-down-right-square",
1877
+ "square-arrow-down",
1878
+ "arrow-down-square",
1879
+ "square-arrow-left",
1880
+ "arrow-left-square",
1881
+ "square-arrow-out-down-left",
1882
+ "arrow-down-left-from-square",
1883
+ "square-arrow-out-down-right",
1884
+ "arrow-down-right-from-square",
1885
+ "square-arrow-out-up-left",
1886
+ "arrow-up-left-from-square",
1887
+ "square-arrow-out-up-right",
1888
+ "arrow-up-right-from-square",
1889
+ "square-arrow-right-enter",
1890
+ "square-arrow-right-exit",
1891
+ "square-arrow-right",
1892
+ "arrow-right-square",
1893
+ "square-arrow-up-left",
1894
+ "arrow-up-left-square",
1895
+ "square-arrow-up-right",
1896
+ "arrow-up-right-square",
1897
+ "square-arrow-up",
1898
+ "arrow-up-square",
1899
+ "square-asterisk",
1900
+ "asterisk-square",
1901
+ "square-bottom-dashed-scissors",
1902
+ "scissors-square-dashed-bottom",
1903
+ "square-centerline-dashed-horizontal",
1904
+ "flip-horizontal",
1905
+ "square-centerline-dashed-vertical",
1906
+ "flip-vertical",
1907
+ "square-chart-gantt",
1908
+ "gantt-chart-square",
1909
+ "square-gantt-chart",
1910
+ "square-check-big",
1911
+ "check-square",
1912
+ "square-check",
1913
+ "check-square-2",
1914
+ "square-chevron-down",
1915
+ "chevron-down-square",
1916
+ "square-chevron-left",
1917
+ "chevron-left-square",
1918
+ "square-chevron-right",
1919
+ "chevron-right-square",
1920
+ "square-chevron-up",
1921
+ "chevron-up-square",
1922
+ "square-code",
1923
+ "code-square",
1924
+ "square-dashed-bottom-code",
1925
+ "square-dashed-bottom",
1926
+ "square-dashed-kanban",
1927
+ "kanban-square-dashed",
1928
+ "square-dashed-mouse-pointer",
1929
+ "mouse-pointer-square-dashed",
1930
+ "square-dashed-text",
1931
+ "text-selection",
1932
+ "text-select",
1933
+ "square-dashed-top-solid",
1934
+ "square-dashed",
1935
+ "box-select",
1936
+ "square-divide",
1937
+ "divide-square",
1938
+ "square-dot",
1939
+ "dot-square",
1940
+ "square-equal",
1941
+ "equal-square",
1942
+ "square-function",
1943
+ "function-square",
1944
+ "square-kanban",
1945
+ "kanban-square",
1946
+ "square-library",
1947
+ "library-square",
1948
+ "square-m",
1949
+ "m-square",
1950
+ "square-menu",
1951
+ "menu-square",
1952
+ "square-minus",
1953
+ "minus-square",
1954
+ "square-mouse-pointer",
1955
+ "inspect",
1956
+ "square-parking-off",
1957
+ "parking-square-off",
1958
+ "square-parking",
1959
+ "parking-square",
1960
+ "square-pause",
1961
+ "square-pen",
1962
+ "pen-box",
1963
+ "edit",
1964
+ "pen-square",
1965
+ "square-percent",
1966
+ "percent-square",
1967
+ "square-pi",
1968
+ "pi-square",
1969
+ "square-pilcrow",
1970
+ "pilcrow-square",
1971
+ "square-play",
1972
+ "play-square",
1973
+ "square-plus",
1974
+ "plus-square",
1975
+ "square-power",
1976
+ "power-square",
1977
+ "square-radical",
1978
+ "square-round-corner",
1979
+ "square-scissors",
1980
+ "scissors-square",
1981
+ "square-sigma",
1982
+ "sigma-square",
1983
+ "square-slash",
1984
+ "slash-square",
1985
+ "square-split-horizontal",
1986
+ "split-square-horizontal",
1987
+ "square-split-vertical",
1988
+ "split-square-vertical",
1989
+ "square-square",
1990
+ "square-stack",
1991
+ "square-star",
1992
+ "square-stop",
1993
+ "square-terminal",
1994
+ "terminal-square",
1995
+ "square-user-round",
1996
+ "user-square-2",
1997
+ "square-user",
1998
+ "user-square",
1999
+ "square-x",
2000
+ "x-square",
2001
+ "square",
2002
+ "squares-exclude",
2003
+ "squares-intersect",
2004
+ "squares-subtract",
2005
+ "squares-unite",
2006
+ "squircle-dashed",
2007
+ "squircle",
2008
+ "squirrel",
2009
+ "stamp",
2010
+ "star-half",
2011
+ "star-off",
2012
+ "star",
2013
+ "step-back",
2014
+ "step-forward",
2015
+ "stethoscope",
2016
+ "sticker",
2017
+ "sticky-note",
2018
+ "stone",
2019
+ "store",
2020
+ "stretch-horizontal",
2021
+ "stretch-vertical",
2022
+ "strikethrough",
2023
+ "subscript",
2024
+ "sun-dim",
2025
+ "sun-medium",
2026
+ "sun-moon",
2027
+ "sun-snow",
2028
+ "sun",
2029
+ "sunrise",
2030
+ "sunset",
2031
+ "superscript",
2032
+ "swatch-book",
2033
+ "swiss-franc",
2034
+ "switch-camera",
2035
+ "sword",
2036
+ "swords",
2037
+ "syringe",
2038
+ "table-2",
2039
+ "table-cells-merge",
2040
+ "table-cells-split",
2041
+ "table-columns-split",
2042
+ "table-of-contents",
2043
+ "table-properties",
2044
+ "table-rows-split",
2045
+ "table",
2046
+ "tablet-smartphone",
2047
+ "tablet",
2048
+ "tablets",
2049
+ "tag",
2050
+ "tags",
2051
+ "tally-1",
2052
+ "tally-2",
2053
+ "tally-3",
2054
+ "tally-4",
2055
+ "tally-5",
2056
+ "tangent",
2057
+ "target",
2058
+ "telescope",
2059
+ "tent-tree",
2060
+ "tent",
2061
+ "terminal",
2062
+ "test-tube-diagonal",
2063
+ "test-tube-2",
2064
+ "test-tube",
2065
+ "test-tubes",
2066
+ "text-align-center",
2067
+ "align-center",
2068
+ "text-align-end",
2069
+ "align-right",
2070
+ "text-align-justify",
2071
+ "align-justify",
2072
+ "text-align-start",
2073
+ "text",
2074
+ "align-left",
2075
+ "text-cursor-input",
2076
+ "text-cursor",
2077
+ "text-initial",
2078
+ "letter-text",
2079
+ "text-quote",
2080
+ "text-search",
2081
+ "text-wrap",
2082
+ "wrap-text",
2083
+ "theater",
2084
+ "thermometer-snowflake",
2085
+ "thermometer-sun",
2086
+ "thermometer",
2087
+ "thumbs-down",
2088
+ "thumbs-up",
2089
+ "ticket-check",
2090
+ "ticket-minus",
2091
+ "ticket-percent",
2092
+ "ticket-plus",
2093
+ "ticket-slash",
2094
+ "ticket-x",
2095
+ "ticket",
2096
+ "tickets-plane",
2097
+ "tickets",
2098
+ "timer-off",
2099
+ "timer-reset",
2100
+ "timer",
2101
+ "toggle-left",
2102
+ "toggle-right",
2103
+ "toilet",
2104
+ "tool-case",
2105
+ "toolbox",
2106
+ "tornado",
2107
+ "torus",
2108
+ "touchpad-off",
2109
+ "touchpad",
2110
+ "towel-rack",
2111
+ "tower-control",
2112
+ "toy-brick",
2113
+ "tractor",
2114
+ "traffic-cone",
2115
+ "train-front-tunnel",
2116
+ "train-front",
2117
+ "train-track",
2118
+ "tram-front",
2119
+ "train",
2120
+ "transgender",
2121
+ "trash-2",
2122
+ "trash",
2123
+ "tree-deciduous",
2124
+ "tree-palm",
2125
+ "palmtree",
2126
+ "tree-pine",
2127
+ "trees",
2128
+ "trending-down",
2129
+ "trending-up-down",
2130
+ "trending-up",
2131
+ "triangle-alert",
2132
+ "alert-triangle",
2133
+ "triangle-dashed",
2134
+ "triangle-right",
2135
+ "triangle",
2136
+ "trophy",
2137
+ "truck-electric",
2138
+ "truck",
2139
+ "turkish-lira",
2140
+ "turntable",
2141
+ "turtle",
2142
+ "tv-minimal-play",
2143
+ "tv-minimal",
2144
+ "tv-2",
2145
+ "tv",
2146
+ "type-outline",
2147
+ "type",
2148
+ "umbrella-off",
2149
+ "umbrella",
2150
+ "underline",
2151
+ "undo-2",
2152
+ "undo-dot",
2153
+ "undo",
2154
+ "unfold-horizontal",
2155
+ "unfold-vertical",
2156
+ "ungroup",
2157
+ "university",
2158
+ "school-2",
2159
+ "unlink-2",
2160
+ "unlink",
2161
+ "unplug",
2162
+ "upload",
2163
+ "usb",
2164
+ "user-check",
2165
+ "user-cog",
2166
+ "user-key",
2167
+ "user-lock",
2168
+ "user-minus",
2169
+ "user-pen",
2170
+ "user-plus",
2171
+ "user-round-check",
2172
+ "user-check-2",
2173
+ "user-round-cog",
2174
+ "user-cog-2",
2175
+ "user-round-key",
2176
+ "user-round-minus",
2177
+ "user-minus-2",
2178
+ "user-round-pen",
2179
+ "user-round-plus",
2180
+ "user-plus-2",
2181
+ "user-round-search",
2182
+ "user-round-x",
2183
+ "user-x-2",
2184
+ "user-round",
2185
+ "user-2",
2186
+ "user-search",
2187
+ "user-star",
2188
+ "user-x",
2189
+ "user",
2190
+ "users-round",
2191
+ "users-2",
2192
+ "users",
2193
+ "utensils-crossed",
2194
+ "fork-knife-crossed",
2195
+ "utensils",
2196
+ "fork-knife",
2197
+ "utility-pole",
2198
+ "van",
2199
+ "variable",
2200
+ "vault",
2201
+ "vector-square",
2202
+ "vegan",
2203
+ "venetian-mask",
2204
+ "venus-and-mars",
2205
+ "venus",
2206
+ "vibrate-off",
2207
+ "vibrate",
2208
+ "video-off",
2209
+ "video",
2210
+ "videotape",
2211
+ "view",
2212
+ "voicemail",
2213
+ "volleyball",
2214
+ "volume-1",
2215
+ "volume-2",
2216
+ "volume-off",
2217
+ "volume-x",
2218
+ "volume",
2219
+ "vote",
2220
+ "wallet-cards",
2221
+ "wallet-minimal",
2222
+ "wallet-2",
2223
+ "wallet",
2224
+ "wallpaper",
2225
+ "wand-sparkles",
2226
+ "wand-2",
2227
+ "wand",
2228
+ "warehouse",
2229
+ "washing-machine",
2230
+ "watch",
2231
+ "waves-arrow-down",
2232
+ "waves-arrow-up",
2233
+ "waves-ladder",
2234
+ "waves",
2235
+ "waypoints",
2236
+ "webcam",
2237
+ "webhook-off",
2238
+ "webhook",
2239
+ "weight-tilde",
2240
+ "weight",
2241
+ "wheat-off",
2242
+ "wheat",
2243
+ "whole-word",
2244
+ "wifi-cog",
2245
+ "wifi-high",
2246
+ "wifi-low",
2247
+ "wifi-off",
2248
+ "wifi-pen",
2249
+ "wifi-sync",
2250
+ "wifi-zero",
2251
+ "wifi",
2252
+ "wind-arrow-down",
2253
+ "wind",
2254
+ "wine-off",
2255
+ "wine",
2256
+ "workflow",
2257
+ "worm",
2258
+ "wrench",
2259
+ "x-line-top",
2260
+ "x",
2261
+ "zap-off",
2262
+ "zap",
2263
+ "zodiac-aquarius",
2264
+ "zodiac-aries",
2265
+ "zodiac-cancer",
2266
+ "zodiac-capricorn",
2267
+ "zodiac-gemini",
2268
+ "zodiac-leo",
2269
+ "zodiac-libra",
2270
+ "zodiac-ophiuchus",
2271
+ "zodiac-pisces",
2272
+ "zodiac-sagittarius",
2273
+ "zodiac-scorpio",
2274
+ "zodiac-taurus",
2275
+ "zodiac-virgo",
2276
+ "zoom-in",
2277
+ "zoom-out"
2278
+ ]);
2279
+ var LAYOUT_SECTION_ICON_SET = new Set(LAYOUT_SECTION_ICONS);
2280
+
2281
+ // src/tools.ts
318
2282
  var FRAMEWORK_CHOICES = ["astro", "next", "react-ts", "other"];
319
2283
  var FRAMEWORK_LABELS = {
320
2284
  astro: "Astro \u2014 recommended default, static by default and fastest to publish",
@@ -381,7 +2345,22 @@ var fieldType = z.enum([
381
2345
  // `config` verbatim — which is what the warning above demands before adding a type here.
382
2346
  // `modular` needs config.blockSlugs; `location` takes no config.
383
2347
  "modular",
384
- "location"
2348
+ "location",
2349
+ // All LEAF types, so the pass-through branch above covers them. `document` is THE article
2350
+ // body — the rich document canvas, collections only, at most one per model, top level
2351
+ // only. It was the conspicuous omission: the dashboard shipped an editor for it while no
2352
+ // agent could create the field. `sections` is a page-section zone composed in the Visual
2353
+ // Editor, so it has no inline control.
2354
+ "document",
2355
+ "longtext",
2356
+ "slug",
2357
+ "email",
2358
+ "phone",
2359
+ "link",
2360
+ "color",
2361
+ "json",
2362
+ "file",
2363
+ "sections"
385
2364
  ]);
386
2365
  var slug = z.string().regex(/^[a-z0-9-]+$/, "lowercase letters, numbers, and hyphens only");
387
2366
  var fieldKey = z.string().regex(/^[a-zA-Z0-9_]+$/, "letters, numbers, and underscores only");
@@ -493,12 +2472,42 @@ function buildToolDefs(deps) {
493
2472
  }
494
2473
  };
495
2474
  }
2475
+ const blockObject = z.object({
2476
+ type: z.enum([
2477
+ "heading",
2478
+ "text",
2479
+ "richtext",
2480
+ "image",
2481
+ "button",
2482
+ "spacer",
2483
+ "video",
2484
+ "columns",
2485
+ "section",
2486
+ "slider",
2487
+ "tabs",
2488
+ "navbar",
2489
+ "footer",
2490
+ "form",
2491
+ "component",
2492
+ "collection"
2493
+ ]).describe("block type; section/slider/tabs/columns nest child blocks"),
2494
+ id: z.string().min(1).describe("stable unique block id"),
2495
+ props: z.record(z.string(), z.unknown()).describe(
2496
+ "per-type props: heading {text, level}; text/richtext {html} (NOT {text}); image {src, alt}; button {text, href}; spacer {height}; video {url}; form {formId}; component {componentId, overrides?}; navbar {links:[{label,href}], logo?, cta?}; footer {columns, copyright?}; section {children: block[]}; columns {columns: block[][], gap} \u2014 a column may NOT hold columns/section/slider/tabs; slider {slides:[{id,children}]}; tabs {tabs:[{id,label,children}]}; collection {cardComponentId?, detailComponentId?, titleField?, excerptField?, limit?, order?, emptyText?} \u2014 lists this page's published entries as cards, and renders ONE entry on /<page>/<entrySlug>"
2497
+ ),
2498
+ style: z.record(z.string(), z.unknown()).optional().describe(
2499
+ "design tokens: theme, bg (none|surface|muted|accent|dark|custom), bgCustom hex, paddingTop/paddingBottom/paddingSides px, contentWidth (narrow|default|wide|full), align, corner, shadow, borderTop/borderBottom. A real marketing band is a `section` block carrying bg + padding + contentWidth."
2500
+ )
2501
+ });
496
2502
  const createPageInput = z.object({
497
2503
  title: z.string().min(1).describe("display title of the page, e.g. 'Home'"),
498
2504
  slug: slug.describe("URL-safe path segment, unique per project, e.g. 'home'"),
499
2505
  pageType: z.enum(["singleton", "dynamic"]).default("singleton").describe(
500
2506
  "'singleton' = exactly one entry (Home, About, Contact); 'dynamic' = many entries sharing this schema (Blog posts, Products). Defaults to singleton."
501
2507
  ),
2508
+ blockJson: z.array(blockObject).optional().describe(
2509
+ "the page's VISUAL composition \u2014 how a components-first page is built. Place one `component` block per section: {type:'component', id:'<stable>', props:{componentId:'<id from create_component>'}}. The component must be PUBLISHED (publish_component) or it renders as nothing on the live site. Independent of `fields`, which is a typed schema for a site's own code to read."
2510
+ ),
502
2511
  fields: z.array(fieldObject).optional().describe("the page's typed schema fields"),
503
2512
  metaTitle: z.string().optional().describe("SEO meta title"),
504
2513
  metaDescription: z.string().optional().describe("SEO meta description")
@@ -629,20 +2638,53 @@ function buildToolDefs(deps) {
629
2638
  fields: z.array(formFieldObject).optional().describe("REPLACES the field array \u2014 include all fields to keep"),
630
2639
  ...formSettingsShape
631
2640
  });
632
- const blockObject = z.object({
633
- type: z.enum(["heading", "text", "image", "button", "spacer", "video", "columns"]).describe("block type; 'columns' nests child blocks in props.columns"),
634
- id: z.string().min(1).describe("stable unique block id"),
635
- props: z.record(z.string(), z.unknown()).describe(
636
- "per-type props: heading {text, level}; text {text}; image {src, alt}; button {text, href}; spacer {height}; video {url}; columns {columns: block[][], gap}"
637
- )
638
- });
639
2641
  const componentPropObject = z.object({
640
2642
  key: z.string().min(1),
641
2643
  label: z.string().min(1),
642
2644
  target: z.object({ blockId: z.string().min(1), path: z.string().min(1) }),
643
- type: z.enum(["text", "richtext", "image", "url", "boolean"]),
2645
+ type: z.enum(["text", "richtext", "image", "url", "boolean", "slot"]),
2646
+ // 'slot' holds ONE nested component instance; config.componentIds restricts what may
2647
+ // fill it. Absent here until now, so a slot allowlist was unreachable from stdio even
2648
+ // once the enum allowed the type.
2649
+ config: z.object({ componentIds: z.array(z.string()).optional() }).optional(),
644
2650
  defaultValue: z.unknown().optional()
645
2651
  });
2652
+ const getLayoutInput = z.object({
2653
+ scope: z.enum(["global", "page"]).default("global"),
2654
+ pageId: z.string().min(1).optional().describe("page id or slug; required for page scope"),
2655
+ projectId: z.string().min(1).optional().describe("required only for a workspace-scoped grant")
2656
+ });
2657
+ const layoutBinding = z.object({ inputId: z.string().min(1), fieldId: z.string().min(1) });
2658
+ const layoutIcon = z.string().min(1).max(80).regex(/^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[A-Z][A-Za-z0-9]+)$/).refine((value) => LAYOUT_SECTION_ICON_SET.has(value), "Select a supported Lucide icon").describe("Lucide icon name in canonical kebab-case; legacy CamelCase Layout icon names remain accepted");
2659
+ const sectionTarget = { sectionId: z.string().min(1) };
2660
+ const layoutCommand = z.discriminatedUnion("type", [
2661
+ z.object({ type: z.literal("set-section-values"), ...sectionTarget, values: z.record(z.string(), z.unknown()) }),
2662
+ z.object({ type: z.literal("set-field-value"), ...sectionTarget, fieldId: z.string().min(1), value: z.unknown() }),
2663
+ z.object({ type: z.literal("add-component"), ...sectionTarget, componentId: z.string().min(1), variantGroupId: z.string().min(1).optional(), bindings: z.array(layoutBinding).optional(), literalValues: z.record(z.string(), z.unknown()).optional() }),
2664
+ z.object({ type: z.literal("remove-item"), ...sectionTarget, itemId: z.string().min(1) }),
2665
+ z.object({ type: z.literal("move-component"), ...sectionTarget, itemId: z.string().min(1), index: z.number().int().nonnegative() }),
2666
+ z.object({ type: z.literal("move-item"), ...sectionTarget, itemId: z.string().min(1), index: z.number().int().nonnegative() }),
2667
+ z.object({ type: z.literal("swap-component-variant"), ...sectionTarget, itemId: z.string().min(1), componentId: z.string().min(1) }),
2668
+ z.object({ type: z.literal("set-page-state"), ...sectionTarget, state: z.enum(["inherit", "override-content", "customize-structure", "disable", "reset"]) }),
2669
+ z.object({ type: z.literal("set-section-state"), ...sectionTarget, state: z.enum(["inherit", "override-content", "customize-structure", "disable", "reset"]) }),
2670
+ z.object({ type: z.literal("add-section"), name: z.string().min(1), icon: layoutIcon, zone: z.enum(["before_page", "after_page"]) }),
2671
+ z.object({ type: z.literal("restore-section"), section: z.object({ id: z.string().min(1) }).passthrough(), data: z.object({ fields: z.record(z.string(), z.unknown()) }), placement: z.object({ zone: z.enum(["above-page-content", "below-page-content"]), localOrderKey: z.string().min(1), afterSectionId: z.string().optional(), beforeSectionId: z.string().optional() }).optional() }),
2672
+ z.object({ type: z.literal("update-section"), ...sectionTarget, name: z.string().min(1).optional(), icon: layoutIcon.optional(), slug: z.string().min(1).optional(), zone: z.enum(["above-page-content", "below-page-content"]).optional(), orderKey: z.string().min(1).optional() }),
2673
+ z.object({ type: z.literal("remove-section"), ...sectionTarget }),
2674
+ z.object({ type: z.literal("move-section"), ...sectionTarget, afterId: z.string().nullable().optional(), beforeId: z.string().nullable().optional() }),
2675
+ z.object({ type: z.literal("add-field"), ...sectionTarget, parentFieldId: z.string().optional(), fieldType: z.enum(["text", "longtext", "richtext", "number", "toggle", "date", "image", "file", "link", "email", "phone", "select", "color", "json", "reference", "multi-reference", "group", "repeater"]).optional(), field: z.object({ id: z.string(), slug: z.string(), label: z.string(), type: z.string() }).passthrough().optional() }),
2676
+ z.object({ type: z.literal("update-field"), ...sectionTarget, fieldId: z.string().min(1), patch: z.object({}).passthrough() }),
2677
+ z.object({ type: z.literal("remove-field"), ...sectionTarget, fieldId: z.string().min(1) }),
2678
+ z.object({ type: z.literal("move-field"), ...sectionTarget, itemId: z.string().min(1), index: z.number().int().nonnegative() }),
2679
+ z.object({ type: z.literal("set-bindings"), ...sectionTarget, itemId: z.string().min(1), bindings: z.array(layoutBinding), literalValues: z.record(z.string(), z.unknown()).optional() })
2680
+ ]);
2681
+ const commandLayoutInput = z.object({
2682
+ scope: z.enum(["global", "page"]).default("global"),
2683
+ pageId: z.string().min(1).optional(),
2684
+ projectId: z.string().min(1).optional().describe("required only for a workspace-scoped grant"),
2685
+ command: layoutCommand.describe("one canonical discriminated Layout command; authority is derived from type"),
2686
+ ifMatch: z.number().int().nonnegative().describe("revision returned by get_layout")
2687
+ });
646
2688
  const componentCategory = z.enum([
647
2689
  "navbar",
648
2690
  "footer",
@@ -988,10 +3030,10 @@ function buildToolDefs(deps) {
988
3030
  // ── Pages (metadata edit; parity with remote /mcp) ──
989
3031
  def(
990
3032
  "update_page",
991
- "Edit a page's metadata",
992
- "Edit a page's metadata \u2014 title, slug, SEO metaTitle/metaDescription, and publish status (draft|published). This is the slug/title/SEO editor (it does NOT change the field schema or content \u2014 use add_page_field / set_page_content for those). Renaming the slug keeps the page's content intact. Provide pageId plus the fields to change.",
993
- z.object({ pageId: z.string().min(1), title: z.string().optional(), slug: z.string().optional(), metaTitle: z.string().optional(), metaDescription: z.string().optional(), status: z.enum(["draft", "published"]).optional() }).shape,
994
- async (c, a) => ok("Updated page.", await data(c, "PATCH", `/management/pages/${s(a.pageId)}/meta`, { title: a.title, slug: a.slug, metaTitle: a.metaTitle, metaDescription: a.metaDescription, status: a.status }))
3033
+ "Edit a page",
3034
+ "Edit a page: title, slug, SEO metaTitle/metaDescription, publish status (draft|published), and `blockJson` (its block composition \u2014 passing it REPLACES the whole array, so read get_page first). It does NOT change the field SCHEMA \u2014 use add_page_field / set_page_content for that. Renaming the slug keeps content intact. Publishing copies the draft blocks live in the same call.",
3035
+ z.object({ pageId: z.string().min(1), title: z.string().optional(), slug: z.string().optional(), blockJson: z.array(blockObject).optional().describe("REPLACES the page's block composition"), metaTitle: z.string().optional(), metaDescription: z.string().optional(), status: z.enum(["draft", "published"]).optional() }).shape,
3036
+ async (c, a) => ok("Updated page.", await data(c, "PATCH", `/management/pages/${s(a.pageId)}/meta`, { title: a.title, slug: a.slug, blockJson: a.blockJson, metaTitle: a.metaTitle, metaDescription: a.metaDescription, status: a.status }))
995
3037
  ),
996
3038
  // ── Code + deploy (parity with remote /mcp; needs artifact:write) ──
997
3039
  def(
@@ -1177,6 +3219,7 @@ function buildToolDefs(deps) {
1177
3219
  title: args.title,
1178
3220
  slug: args.slug,
1179
3221
  pageType: args.pageType ?? "singleton",
3222
+ ...args.blockJson ? { blockJson: args.blockJson } : {},
1180
3223
  ...args.fields ? { fields: args.fields.map(toField) } : {},
1181
3224
  ...args.metaTitle !== void 0 ? { metaTitle: args.metaTitle } : {},
1182
3225
  ...args.metaDescription !== void 0 ? { metaDescription: args.metaDescription } : {}
@@ -1463,6 +3506,31 @@ function buildToolDefs(deps) {
1463
3506
  })
1464
3507
  )
1465
3508
  },
3509
+ // ── Project/page Layout (draft-only; publish remains dashboard-gated) ──
3510
+ {
3511
+ name: "get_layout",
3512
+ config: {
3513
+ title: "Get the project or page Layout draft",
3514
+ description: "Read the Global Layout or one page's Layout override, including its optimistic revision. Always read this before update_layout.",
3515
+ inputSchema: getLayoutInput.shape
3516
+ },
3517
+ handler: guard(async (args) => withClient(async (client) => {
3518
+ const layout = await client.getManagedLayout(args);
3519
+ return ok(`${layout.scope === "global" ? "Global" : `Page ${layout.pageSlug}`} Layout draft at revision ${layout.revision}.`, layout);
3520
+ }))
3521
+ },
3522
+ {
3523
+ name: "update_layout",
3524
+ config: {
3525
+ title: "Apply one Layout draft command",
3526
+ description: "Apply one permission-shaped values/composition/schema command to the Global Layout or a page override. Draft-only: this never publishes. Pass the revision from get_layout as ifMatch.",
3527
+ inputSchema: commandLayoutInput.shape
3528
+ },
3529
+ handler: guard(async (args) => withClient(async (client) => {
3530
+ const layout = await client.commandManagedLayout({ ...args, command: args.command });
3531
+ return ok(`Updated ${layout.scope === "global" ? "Global" : `Page ${layout.pageSlug}`} Layout draft to revision ${layout.revision}.`, layout);
3532
+ }))
3533
+ },
1466
3534
  // ── Components (discover + author reusable symbols) ──
1467
3535
  {
1468
3536
  name: "list_components",
@@ -1562,6 +3630,23 @@ ${lines.join("\n")}`, found);
1562
3630
  })
1563
3631
  )
1564
3632
  },
3633
+ {
3634
+ name: "publish_component",
3635
+ config: {
3636
+ title: "Publish a component",
3637
+ description: "Publish a component: copy its DRAFT definition to the live copy and re-bake every published page that embeds it. This is the ONLY way a component reaches the live site \u2014 create_component and update_component write drafts, and an unpublished component renders as NOTHING on the live site, with no error. Publish every component you place on a page. 403 PUBLISH_NOT_GRANTED means this connection may author but not publish: say so and let the user publish from the dashboard. 422 means publishing would break a Layout that uses it \u2014 the response names which.",
3638
+ inputSchema: getComponentInput.shape
3639
+ },
3640
+ handler: guard(
3641
+ async (args) => withClient(async (client) => {
3642
+ const res = await client.fetchJSON(
3643
+ client.url(`/management/components/${args.componentId}/publish`),
3644
+ { method: "POST" }
3645
+ );
3646
+ return ok("Published component.", res.data);
3647
+ })
3648
+ )
3649
+ },
1565
3650
  // ── AI content + SEO actions (Option B) ────────────────────────────────────
1566
3651
  {
1567
3652
  name: "write_content",
@@ -1611,29 +3696,144 @@ function registerTools(server, deps) {
1611
3696
 
1612
3697
  // src/prompts.ts
1613
3698
  import { z as z2 } from "zod";
1614
- var SCHEMA_PROPOSAL_FLOW = `### Whole-project schema design (declarative, confirm-first) \u2192 \`create_page\` / \`add_field\`
1615
- Design the WHOLE project's content schema from its code, and **confirm the
1616
- shape with the user BEFORE creating anything**. Never silently guess.
1617
- 1. **Read the project's code** \u2014 the connected git repo OR, for an uploaded project,
1618
- its source in your current working directory (same thing: pages/routes and their
1619
- components). For each page, identify the editable regions and how they're structured.
1620
- 2. **Destructure every page into a tree**, do NOT flatten. Map each region to:
1621
- - a plain field (text/richtext/image/number/boolean/select/date/datetime/reference),
1622
- - a **group** (Non-Repeatable Zone \u2014 a fixed grouped block, e.g. a hero with
1623
- heading + subheading + image), or
1624
- - a **repeater** (Repeatable Zone / section-list \u2014 a repeating list of items
1625
- such as feature cards, testimonials, FAQs, pricing tiers), each carrying its
1626
- own child \`fields\`. Use \`array\` only for primitive lists (tags, bullet strings).
1627
- Decide pageType per page: singleton (Home/About/Contact) vs dynamic (Blog/Products).
1628
- 3. **Present the proposal for confirmation (REQUIRED gate).** Show the full tree \u2014
1629
- page \u2192 zones \u2192 nested fields, with each zone labelled group vs repeater \u2014 and ask
1630
- the user (AskUserQuestion) to confirm or adjust: which zones repeat, what fields
1631
- each holds, singleton vs dynamic, any missing/extra pages. Iterate until they
1632
- approve. Do NOT call create_page / add_field before this approval.
1633
- 4. **Build it** \u2014 once approved, call \`create_page\` once per page with the full
1634
- nested \`fields\` tree; use \`add_field\`/\`add_page_field\` only to extend later.
1635
- Keep field keys stable and human-readable. Schema only \u2014 no content yet.
1636
- Field object: { key, label, type, required?, options?, config?, fields? }.`;
3699
+
3700
+ // src/playbook.ts
3701
+ var SCHEMA_PLAYBOOK = `# Designing a BetterCMS project
3702
+
3703
+ Read this BEFORE creating anything. Confirm the shape with the user before you build it.
3704
+
3705
+ ## 1. Pick the architecture first
3706
+
3707
+ **Components-first** \u2014 a marketing site. A library of reusable *components*, each a
3708
+ section, and thin pages that place them. Editors add, reorder and swap sections without
3709
+ touching a schema. This is what \`create_component\` + \`create_page(blockJson)\` are for.
3710
+
3711
+ **Schema-first** \u2014 a blog, a product catalogue, a directory: many rows sharing one shape.
3712
+ A collection (\`create_content_model\`) plus entries.
3713
+
3714
+ Most real sites are both: components for the marketing pages, a collection for the blog.
3715
+ Decide before your first call; converting later means rewriting content.
3716
+
3717
+ ## 2. The decision tree
3718
+
3719
+ Repeated visual region on a page? -> a COMPONENT with sectionType (a Section)
3720
+ ...and it comes in more than one look? -> siblings sharing that sectionType = VARIANTS
3721
+ A stack of mixed, reorderable content? -> kind:'block' models + a \`modular\` field
3722
+ A row in a list (post, author, tier)? -> a collection (kind:'model')
3723
+ The one body of an article? -> type:'document' (exactly one, top level)
3724
+ A fixed cluster of fields? -> group (never a 1-item repeater)
3725
+ A repeating cluster? -> repeater
3726
+ A list of plain strings? -> array (never a repeater of one text)
3727
+ Site-wide nav/footer? -> place the project's provisioned components
3728
+
3729
+ ## 3. Anatomy of a real section component
3730
+
3731
+ A component that is only headings and text renders as an unstyled stack. Every section the
3732
+ product ships looks like this \u2014 a \`section\` block carrying \`style\`, with content nested in
3733
+ \`props.children\`:
3734
+
3735
+ {
3736
+ type: "section", id: "root",
3737
+ style: { bg: "surface", paddingTop: 96, paddingBottom: 96, contentWidth: "default", align: "center" },
3738
+ props: { children: [
3739
+ { type: "heading", id: "h", props: { text: "Headline", level: 2 } },
3740
+ { type: "text", id: "sub", props: { html: "<p>Supporting copy.</p>" } },
3741
+ { type: "button", id: "cta", props: { text: "Get started", href: "/signup", variant: "primary" } }
3742
+ ] }
3743
+ }
3744
+
3745
+ Then declare what an editor may change, via \`props\`:
3746
+
3747
+ props: [
3748
+ { key: "headline", label: "Headline", target: { blockId: "h", path: "props.text" }, type: "text" },
3749
+ { key: "body", label: "Body", target: { blockId: "sub", path: "props.html" }, type: "richtext" },
3750
+ { key: "ctaHref", label: "CTA link", target: { blockId: "cta", path: "props.href" }, type: "url" }
3751
+ ]
3752
+
3753
+ Declare props only for what should really be editable. Every prop is a decision an editor
3754
+ has to make.
3755
+
3756
+ ## 4. Variants
3757
+
3758
+ Components sharing a \`sectionType\` are swappable layouts of one section family \u2014 "Hero
3759
+ centered" and "Hero split" both with \`sectionType: "Hero"\`. Swapping is one write and
3760
+ keeps content, because overrides are keyed by prop KEY.
3761
+
3762
+ So **use the same prop keys across a family**. A variant that calls it \`title\` where its
3763
+ sibling calls it \`headline\` silently drops that content on the swap.
3764
+
3765
+ Pair \`sectionType\` with a library \`category\` (hero, content, social-proof, conversion) or
3766
+ the component never appears in the editor's "Add a section" picker.
3767
+
3768
+ ## 5. Blocks and modular fields
3769
+
3770
+ A \`kind:'block'\` model holds no entries of its own; it exists to be stacked inside another
3771
+ model's \`modular\` field. Create the blocks FIRST, then name their slugs (not ids) in
3772
+ \`config.blockSlugs\`. This is the page-builder shape: one \`sections\` field holding an
3773
+ ordered list of typed blocks.
3774
+
3775
+ ## 6. Blogs
3776
+
3777
+ author collection: name, avatar, bio
3778
+ blog-post collection: title, slug, excerpt, cover (image),
3779
+ body (document), author (reference -> author)
3780
+
3781
+ \`document\` is THE article body: a rich document canvas, **collections only**, at most one
3782
+ per model, top level only (never inside a group or repeater). A page's body is its block
3783
+ content, so \`document\` on a page is rejected. Use \`richtext\` for a short formatted field,
3784
+ \`longtext\` for multi-line plain text.
3785
+
3786
+ Then the pages:
3787
+
3788
+ create_page slug:"blog" pageType:"dynamic" fields:[...the post schema...]
3789
+ blockJson: [ nav, heading, { type:"collection", id:"list", props:{} }, footer ]
3790
+
3791
+ create_content_entry per post, with pageId set to that page
3792
+
3793
+ The \`collection\` block is lane-aware: on \`/blog\` it renders a card per entry, and on
3794
+ \`/blog/<slug>\` it renders THAT entry. One page, both jobs. Every OTHER block in the array
3795
+ is interpolated per entry with \`{{fieldKey}}\` placeholders \u2014 \`{{title}}\`, \`{{cover.url}}\`,
3796
+ \`{{body.html}}\`. Note that richtext and document bind to \`.html\` only, never the bare name.
3797
+
3798
+ ## 7. Order of operations
3799
+
3800
+ 1. blocks create_content_model kind:'block' (before anything references them)
3801
+ 2. collections create_content_model
3802
+ 3. components create_component (they land as DRAFTS)
3803
+ 4. publish publish_component <- every component you intend to place
3804
+ 5. pages create_page with blockJson placing those components
3805
+ 6. content create_content_entry / set_page_content
3806
+ 7. publish update_page status:'published'
3807
+ 8. check get_next_steps, and fix what it lists
3808
+
3809
+ ## 8. Two ways to ship a blank site
3810
+
3811
+ **An unpublished component renders as an empty string.** Not an error, not a placeholder \u2014
3812
+ nothing, on a page that returns 200. If a section is missing from the live site, check
3813
+ \`publish_component\` before anything else.
3814
+
3815
+ **A workspace-level component (\`projectId: null\`) never reaches a live site.** It resolves
3816
+ in preview and is blank in production. Always pass the project's id.
3817
+ `;
3818
+
3819
+ // src/prompts.ts
3820
+ var SCHEMA_PROPOSAL_FLOW = `### Whole-project design (confirm-first) \u2192 \`create_component\` / \`create_page\` / \`create_content_model\`
3821
+ Design the WHOLE project from its brief or its code, and **confirm the shape with the user
3822
+ BEFORE creating anything**. Never silently guess.
3823
+
3824
+ 1. **Read the source** \u2014 the connected repo, or the uploaded project in your working
3825
+ directory. For each page, identify the repeated visual regions and the list-shaped data.
3826
+ 2. **Classify every part** using the decision tree in the playbook below. The two mistakes
3827
+ that matter: flattening a marketing page into loose page fields when its sections should
3828
+ be COMPONENTS, and giving a blog a \`richtext\` field when its body should be \`document\`.
3829
+ 3. **Present the proposal (REQUIRED gate).** Show the component library (with each section's
3830
+ family and variants), the collections and their fields, and the pages that place them.
3831
+ Ask the user (AskUserQuestion) to confirm or adjust. Do not create anything before this.
3832
+ 4. **Build it in the playbook's order** \u2014 blocks, collections, components, PUBLISH the
3833
+ components, pages, content, publish. Skipping the publish step ships a blank site.
3834
+
3835
+ ${SCHEMA_PLAYBOOK}
3836
+ `;
1637
3837
  var PAGE_FLOW = `### Page authoring \u2192 \`create_page\` tool
1638
3838
  Author a page (the page-first schema). Ask, in order, via AskUserQuestion:
1639
3839
  1. **Page type** \u2014 singleton (exactly one entry: Home, About, Contact) vs dynamic
@@ -1676,20 +3876,36 @@ Author a form (then the user embeds it with \`<BcmsForm form={getForm('Name')} /
1676
3876
  4. **Confirm**, then \`create_form\` { name, fields, ... } (returns the new id), or
1677
3877
  \`update_form\` { formId, ... } to edit (passing \`fields\` REPLACES the array \u2014 include all).
1678
3878
  5. Offer to wire \`<BcmsForm>\` into the page/component where the user wants it.`;
1679
- var COMPONENT_FLOW = `### Component authoring \u2192 \`create_component\` / \`update_component\` tools
1680
- Author a reusable component (Webflow-style symbol) the user renders with \`<BcmsBlocks>\`.
1681
- blockJson is the visual definition; authoring it blind is error-prone, so go slow and
1682
- confirm. Never guess the layout.
3879
+ var COMPONENT_FLOW = `### Component authoring \u2192 \`create_component\` / \`publish_component\`
3880
+ Author a reusable section. blockJson is the visual definition; authoring it blind is
3881
+ error-prone, so go slow and confirm. Never guess the layout.
1683
3882
  1. **Discover** \u2014 \`list_components\` / \`get_component\` (read before update; keep existing blocks).
1684
- 2. **Design the blockJson tree** \u2014 an array of blocks, each { type, id, props }. Types:
1685
- heading {text, level 1-6}, text {text}, image {src, alt}, button {text, href}, spacer
1686
- {height}, video {url}, and **columns** {columns: array of arrays of blocks, gap} which
1687
- NESTS child blocks. Give every block a stable unique id.
1688
- 3. **Props (optional)** \u2014 declare overridable fields: { key, label, target: { blockId, path },
1689
- type: text|richtext|image|url|boolean, defaultValue? } so instances can be customized.
1690
- 4. **Confirm the structure** (AskUserQuestion: show the block tree), then \`create_component\`
1691
- { name, slug, category?, blockJson, props? } (returns the id), or \`update_component\`
1692
- { componentId, ... } \u2014 note updating re-bakes every page that embeds it.`;
3883
+ 2. **Design the tree** \u2014 wrap the section in a \`section\` block carrying \`style\`
3884
+ (bg + paddingTop/paddingBottom + contentWidth) and nest content in props.children. See
3885
+ "Anatomy of a real section component" in the playbook. Give every block a stable id.
3886
+ 3. **sectionType + category** \u2014 set both, or the component never appears in the editor's
3887
+ "Add a section" picker. Components sharing a sectionType are swappable VARIANTS, so reuse
3888
+ the same prop keys across a family or a swap drops content.
3889
+ 4. **Props** \u2014 declare only what should really be editable:
3890
+ { key, label, target: { blockId, path }, type: text|richtext|image|url|boolean|slot }.
3891
+ 5. **Confirm the structure** (AskUserQuestion: show the block tree), then \`create_component\`.
3892
+ 6. **\`publish_component\`.** It lands as a DRAFT, and a draft component renders as NOTHING on
3893
+ the live site \u2014 no error, no placeholder. This step is not optional.
3894
+ `;
3895
+ var LAYOUT_FLOW = `### Project/page Layout authoring \u2192 \`get_layout\` / \`update_layout\`
3896
+ Edit the project's draft Global Layout or one page's draft override. Layout publishing stays
3897
+ in the dashboard; these tools never change the live site.
3898
+ 1. **Read first** \u2014 call \`get_layout\` with scope \`global\`, or scope \`page\` + pageId.
3899
+ Keep the returned \`revision\`; every write must pass it as \`ifMatch\`.
3900
+ 2. **Choose one discriminated command type** \u2014 the server derives its authority family;
3901
+ callers cannot claim a weaker family for a schema or composition mutation.
3902
+ 3. **Apply one canonical command** with \`update_layout\`, then use the returned revision for
3903
+ the next command. A 409 means somebody else edited it: re-read; never blindly retry.
3904
+ 4. Direct fields are headless data. Only Component items render markup. Navigation/Footer
3905
+ are reserved Sections and cannot be deleted or moved; page overrides may inherit,
3906
+ override content, customize structure, or disable them.
3907
+ 5. Read Component/Variant identities before attaching or swapping. Required values and
3908
+ bindings must be complete before a human publishes from the dashboard.`;
1693
3909
  var BUILD_SITE_FLOW = `### Build a whole site (schema \u2192 pages \u2192 AI copy) \u2192 composes the flows below
1694
3910
  End-to-end authoring from a repo or a brief. Confirm-first at every stage.
1695
3911
  1. **Schema** \u2014 run the whole-project schema design above: propose the page/zone/field tree,
@@ -1761,6 +3977,8 @@ ${FORM_FLOW}
1761
3977
 
1762
3978
  ${COMPONENT_FLOW}
1763
3979
 
3980
+ ${LAYOUT_FLOW}
3981
+
1764
3982
  ${BUILD_SITE_FLOW}
1765
3983
 
1766
3984
  ${LANDING_PAGES_FLOW}
@@ -1774,6 +3992,29 @@ here \u2014 route to it the same way.`
1774
3992
  ]
1775
3993
  })
1776
3994
  );
3995
+ server.registerPrompt(
3996
+ "edit_layout",
3997
+ {
3998
+ title: "Edit project or page Layout (guided)",
3999
+ description: "Safely edit a draft Global Layout or page override with optimistic locking. Publishing remains in the dashboard.",
4000
+ argsSchema: {
4001
+ request: z2.string().optional().describe("what to change, e.g. 'disable the footer on the pricing page'")
4002
+ }
4003
+ },
4004
+ ({ request }) => ({
4005
+ messages: [{
4006
+ role: "user",
4007
+ content: {
4008
+ type: "text",
4009
+ text: `Edit the BetterCMS Layout draft.${request ? ` The user wants: "${request}".` : ""}
4010
+
4011
+ ${LAYOUT_FLOW}
4012
+
4013
+ Report which scope changed and the new revision. Remind the user that publishing is a separate dashboard action.`
4014
+ }
4015
+ }]
4016
+ })
4017
+ );
1777
4018
  server.registerPrompt(
1778
4019
  "propose_schema",
1779
4020
  {