@@ -17,6 +17,8 @@ import { App } from "./app";
1717import {
1818 AppBridge ,
1919 getToolUiResourceUri ,
20+ isToolVisibilityModelOnly ,
21+ isToolVisibilityAppOnly ,
2022 type McpUiHostCapabilities ,
2123} from "./app-bridge" ;
2224
@@ -921,3 +923,153 @@ describe("getToolUiResourceUri", () => {
921923 } ) ;
922924 } ) ;
923925} ) ;
926+
927+ describe ( "isToolVisibilityModelOnly" , ( ) => {
928+ describe ( "returns true" , ( ) => {
929+ it ( "when visibility is exactly ['model']" , ( ) => {
930+ const tool = {
931+ name : "test-tool" ,
932+ _meta : { ui : { visibility : [ "model" ] } } ,
933+ } ;
934+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( true ) ;
935+ } ) ;
936+ } ) ;
937+
938+ describe ( "returns false" , ( ) => {
939+ it ( "when visibility is ['app']" , ( ) => {
940+ const tool = {
941+ name : "test-tool" ,
942+ _meta : { ui : { visibility : [ "app" ] } } ,
943+ } ;
944+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
945+ } ) ;
946+
947+ it ( "when visibility is ['model', 'app']" , ( ) => {
948+ const tool = {
949+ name : "test-tool" ,
950+ _meta : { ui : { visibility : [ "model" , "app" ] } } ,
951+ } ;
952+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
953+ } ) ;
954+
955+ it ( "when visibility is ['app', 'model']" , ( ) => {
956+ const tool = {
957+ name : "test-tool" ,
958+ _meta : { ui : { visibility : [ "app" , "model" ] } } ,
959+ } ;
960+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
961+ } ) ;
962+
963+ it ( "when visibility is empty array" , ( ) => {
964+ const tool = {
965+ name : "test-tool" ,
966+ _meta : { ui : { visibility : [ ] } } ,
967+ } ;
968+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
969+ } ) ;
970+
971+ it ( "when visibility is undefined" , ( ) => {
972+ const tool = {
973+ name : "test-tool" ,
974+ _meta : { ui : { } } ,
975+ } ;
976+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
977+ } ) ;
978+
979+ it ( "when _meta.ui is missing" , ( ) => {
980+ const tool = {
981+ name : "test-tool" ,
982+ _meta : { } ,
983+ } ;
984+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
985+ } ) ;
986+
987+ it ( "when _meta is missing" , ( ) => {
988+ const tool = { name : "test-tool" } ;
989+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
990+ } ) ;
991+
992+ it ( "when tool has resourceUri but no visibility" , ( ) => {
993+ const tool = {
994+ name : "test-tool" ,
995+ _meta : { ui : { resourceUri : "ui://server/app.html" } } ,
996+ } ;
997+ expect ( isToolVisibilityModelOnly ( tool ) ) . toBe ( false ) ;
998+ } ) ;
999+ } ) ;
1000+ } ) ;
1001+
1002+ describe ( "isToolVisibilityAppOnly" , ( ) => {
1003+ describe ( "returns true" , ( ) => {
1004+ it ( "when visibility is exactly ['app']" , ( ) => {
1005+ const tool = {
1006+ name : "test-tool" ,
1007+ _meta : { ui : { visibility : [ "app" ] } } ,
1008+ } ;
1009+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( true ) ;
1010+ } ) ;
1011+ } ) ;
1012+
1013+ describe ( "returns false" , ( ) => {
1014+ it ( "when visibility is ['model']" , ( ) => {
1015+ const tool = {
1016+ name : "test-tool" ,
1017+ _meta : { ui : { visibility : [ "model" ] } } ,
1018+ } ;
1019+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1020+ } ) ;
1021+
1022+ it ( "when visibility is ['model', 'app']" , ( ) => {
1023+ const tool = {
1024+ name : "test-tool" ,
1025+ _meta : { ui : { visibility : [ "model" , "app" ] } } ,
1026+ } ;
1027+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1028+ } ) ;
1029+
1030+ it ( "when visibility is ['app', 'model']" , ( ) => {
1031+ const tool = {
1032+ name : "test-tool" ,
1033+ _meta : { ui : { visibility : [ "app" , "model" ] } } ,
1034+ } ;
1035+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1036+ } ) ;
1037+
1038+ it ( "when visibility is empty array" , ( ) => {
1039+ const tool = {
1040+ name : "test-tool" ,
1041+ _meta : { ui : { visibility : [ ] } } ,
1042+ } ;
1043+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1044+ } ) ;
1045+
1046+ it ( "when visibility is undefined" , ( ) => {
1047+ const tool = {
1048+ name : "test-tool" ,
1049+ _meta : { ui : { } } ,
1050+ } ;
1051+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1052+ } ) ;
1053+
1054+ it ( "when _meta.ui is missing" , ( ) => {
1055+ const tool = {
1056+ name : "test-tool" ,
1057+ _meta : { } ,
1058+ } ;
1059+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1060+ } ) ;
1061+
1062+ it ( "when _meta is missing" , ( ) => {
1063+ const tool = { name : "test-tool" } ;
1064+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1065+ } ) ;
1066+
1067+ it ( "when tool has resourceUri but no visibility" , ( ) => {
1068+ const tool = {
1069+ name : "test-tool" ,
1070+ _meta : { ui : { resourceUri : "ui://server/app.html" } } ,
1071+ } ;
1072+ expect ( isToolVisibilityAppOnly ( tool ) ) . toBe ( false ) ;
1073+ } ) ;
1074+ } ) ;
1075+ } ) ;
0 commit comments