@@ -810,6 +810,14 @@ or NodeCardState.OnNodeRateLimited
810810 Helpers . FluentIconCatalog . StatusOk ,
811811 "SystemFillColorSuccessBrush" ,
812812 capCount == 1 ? LocalizationHelper . GetString ( "ConnectionPage_NodeActiveOneCapability" ) : string . Format ( LocalizationHelper . GetString ( "ConnectionPage_NodeActiveCapabilities" ) , capCount ) ) ,
813+ NodeCardState . OnNodeConnecting => (
814+ Helpers . FluentIconCatalog . Sync ,
815+ "SystemFillColorCautionBrush" ,
816+ LocalizationHelper . GetString ( "ConnectionPage_NodeStarting" ) ) ,
817+ NodeCardState . OffMcpOnly => (
818+ Helpers . FluentIconCatalog . Terminal ,
819+ "SystemFillColorAttentionBrush" ,
820+ LocalizationHelper . GetString ( "ConnectionPage_NodeMcpOnly" ) ) ,
813821 NodeCardState . OnPermissionsIncomplete => (
814822 Helpers . FluentIconCatalog . StatusWarn ,
815823 "SystemFillColorCautionBrush" ,
@@ -854,47 +862,72 @@ or NodeCardState.OnNodeRateLimited
854862 ? ResolveBrush ( "SystemFillColorCriticalBrush" )
855863 : ResolveBrush ( "TextFillColorPrimaryBrush" ) ;
856864
857- // The gateway's node-list contract owns this boundary. Pending
858- // declarations are visible for approval context but never counted or
859- // labeled as approved/effective.
860- bool showSurfaces = settings != null && plan . NodeCard != NodeCardState . Off
861- && plan . NodeCard != NodeCardState . Hidden ;
862- NodeCapabilityText . Visibility = showSurfaces ? Visibility . Visible : Visibility . Collapsed ;
863- NodeCommandText . Visibility = showSurfaces ? Visibility . Visible : Visibility . Collapsed ;
864- NodePermissionText . Visibility = showSurfaces ? Visibility . Visible : Visibility . Collapsed ;
865- if ( showSurfaces )
866- {
867- NodeCapabilityText . Text = BuildNodeSurfaceListString (
868- "ConnectionPage_NodeEffectiveCapabilities" ,
869- plan . NodeEffectiveCapabilities ) ;
870- NodeCommandText . Text = BuildNodeSurfaceListString (
871- "ConnectionPage_NodeEffectiveCommands" ,
872- plan . NodeEffectiveCommands ) ;
873- NodePermissionText . Text = BuildNodePermissionListString (
874- "ConnectionPage_NodeEffectivePermissions" ,
875- plan . NodeEffectivePermissions ) ;
876- }
877-
878- var showPendingDeclarations = showSurfaces &&
879- ( plan . NodeApprovalState is GatewayNodeApprovalState . PendingApproval or
880- GatewayNodeApprovalState . PendingReapproval ||
881- plan . NodePendingDeclaredCapabilities . Count > 0 ||
882- plan . NodePendingDeclaredCommands . Count > 0 ||
883- plan . NodePendingDeclaredPermissions . Count > 0 ) ;
884- NodePendingDeclarationsPanel . Visibility = showPendingDeclarations
885- ? Visibility . Visible
886- : Visibility . Collapsed ;
887- if ( showPendingDeclarations )
865+ if ( plan . NodeCard == NodeCardState . OffMcpOnly )
866+ {
867+ NodeCapabilityText . Visibility = Visibility . Visible ;
868+ NodeCapabilityText . Text = LocalizationHelper . Format (
869+ "ConnectionPage_NodeMcpOnlyReachable" , NodeService . McpServerUrl ) ;
870+ NodeCommandText . Visibility = Visibility . Collapsed ;
871+ NodePermissionText . Visibility = Visibility . Collapsed ;
872+ NodePendingDeclarationsPanel . Visibility = Visibility . Collapsed ;
873+
874+ var mcpError = CurrentApp . ActiveNodeService ? . McpStartupError ;
875+ if ( ! string . IsNullOrEmpty ( mcpError ) )
876+ {
877+ NodeStatusIcon . Glyph = Helpers . FluentIconCatalog . StatusErr ;
878+ NodeStatusIcon . Foreground = ResolveBrush ( "SystemFillColorCriticalBrush" ) ;
879+ NodeStatusText . Text = LocalizationHelper . GetString ( "ConnectionPage_NodeMcpError" ) ;
880+ NodeStatusText . Foreground = ResolveBrush ( "SystemFillColorCriticalBrush" ) ;
881+ NodeCapabilityText . Visibility = Visibility . Collapsed ;
882+ NodeBodyText . Text = mcpError ;
883+ NodeBodyText . Foreground = ResolveBrush ( "SystemFillColorCriticalBrush" ) ;
884+ NodeBodyText . Visibility = Visibility . Visible ;
885+ }
886+ }
887+ else
888888 {
889- NodePendingCapabilityText . Text = BuildNodeSurfaceListString (
890- "ConnectionPage_NodePendingDeclaredCapabilities" ,
891- plan . NodePendingDeclaredCapabilities ) ;
892- NodePendingCommandText . Text = BuildNodeSurfaceListString (
893- "ConnectionPage_NodePendingDeclaredCommands" ,
894- plan . NodePendingDeclaredCommands ) ;
895- NodePendingPermissionText . Text = BuildNodePermissionListString (
896- "ConnectionPage_NodePendingDeclaredPermissions" ,
897- plan . NodePendingDeclaredPermissions ) ;
889+ // Pending declarations are visible for approval context but never
890+ // counted as the active node contract.
891+ bool showSurfaces = settings != null && plan . NodeCard != NodeCardState . Off
892+ && plan . NodeCard != NodeCardState . Hidden
893+ && plan . NodeCard != NodeCardState . OnNodeConnecting ;
894+ NodeCapabilityText . Visibility = showSurfaces ? Visibility . Visible : Visibility . Collapsed ;
895+ NodeCommandText . Visibility = showSurfaces ? Visibility . Visible : Visibility . Collapsed ;
896+ NodePermissionText . Visibility = showSurfaces ? Visibility . Visible : Visibility . Collapsed ;
897+ if ( showSurfaces )
898+ {
899+ NodeCapabilityText . Text = BuildNodeSurfaceListString (
900+ "ConnectionPage_NodeEffectiveCapabilities" ,
901+ plan . NodeEffectiveCapabilities ) ;
902+ NodeCommandText . Text = BuildNodeSurfaceListString (
903+ "ConnectionPage_NodeEffectiveCommands" ,
904+ plan . NodeEffectiveCommands ) ;
905+ NodePermissionText . Text = BuildNodePermissionListString (
906+ "ConnectionPage_NodeEffectivePermissions" ,
907+ plan . NodeEffectivePermissions ) ;
908+ }
909+
910+ var showPendingDeclarations = showSurfaces &&
911+ ( plan . NodeApprovalState is GatewayNodeApprovalState . PendingApproval or
912+ GatewayNodeApprovalState . PendingReapproval ||
913+ plan . NodePendingDeclaredCapabilities . Count > 0 ||
914+ plan . NodePendingDeclaredCommands . Count > 0 ||
915+ plan . NodePendingDeclaredPermissions . Count > 0 ) ;
916+ NodePendingDeclarationsPanel . Visibility = showPendingDeclarations
917+ ? Visibility . Visible
918+ : Visibility . Collapsed ;
919+ if ( showPendingDeclarations )
920+ {
921+ NodePendingCapabilityText . Text = BuildNodeSurfaceListString (
922+ "ConnectionPage_NodePendingDeclaredCapabilities" ,
923+ plan . NodePendingDeclaredCapabilities ) ;
924+ NodePendingCommandText . Text = BuildNodeSurfaceListString (
925+ "ConnectionPage_NodePendingDeclaredCommands" ,
926+ plan . NodePendingDeclaredCommands ) ;
927+ NodePendingPermissionText . Text = BuildNodePermissionListString (
928+ "ConnectionPage_NodePendingDeclaredPermissions" ,
929+ plan . NodePendingDeclaredPermissions ) ;
930+ }
898931 }
899932
900933 // Sync toggle from current settings (suppress event)
@@ -1069,7 +1102,9 @@ private List<Border> BuildCapabilityChips(IReadOnlyList<string>? capabilities, N
10691102 {
10701103 var chips = new List < Border > ( ) ;
10711104 if ( capabilities == null || capabilities . Count == 0 ) return chips ;
1072- if ( state == NodeCardState . Off || state == NodeCardState . Hidden ) return chips ;
1105+ if ( state == NodeCardState . Off || state == NodeCardState . Hidden
1106+ || state == NodeCardState . OffMcpOnly || state == NodeCardState . OnNodeConnecting )
1107+ return chips ;
10731108
10741109 void Add ( string label , bool enabled , bool warn = false , bool error = false )
10751110 {
0 commit comments