@@ -225,6 +225,15 @@ def _container_has_intent(self, container, name: str) -> bool:
225225 """Return whether the container already knows ``name`` (reload path)."""
226226 return name in getattr (container , "intent_samples" , {})
227227
228+ def _container_exclude_keywords (self , container , name : str ,
229+ keywords : List [str ]) -> None :
230+ """Register suppression keywords for ``name`` on the container."""
231+ container .exclude_keywords (name , keywords )
232+
233+ def _container_get_intent_samples (self , container , name : str ) -> Optional [List [str ]]:
234+ """Return the live registered samples for ``name``, or ``None``."""
235+ return getattr (container , "intent_samples" , {}).get (name )
236+
228237 # ------------------------------------------------------------------
229238
230239 def __detach_intent (self , intent_name ):
@@ -440,14 +449,14 @@ def handle_register_template(self, message: Message):
440449 self ._template_samples [(lang , name )] = list (samples )
441450 self ._store_context_gate (name , data )
442451 try :
443- self .containers [lang ]. add_intent ( name , samples )
452+ self ._container_add_intent ( self . containers [lang ], name , samples )
444453 except RuntimeError :
445- if name not in self .containers [lang ]. intent_samples :
454+ if not self ._container_has_intent ( self . containers [lang ], name ) :
446455 raise
447456
448457 blacklist = data .get ("blacklist" )
449458 if blacklist : # §6.1 suppression phrases
450- self .containers [lang ]. exclude_keywords ( name , list (blacklist ))
459+ self ._container_exclude_keywords ( self . containers [lang ], name , list (blacklist ))
451460
452461 def handle_register_entity (self , message : Message ):
453462 """OVOS-INTENT-4 §7 — register an entity value-set hint."""
@@ -479,7 +488,7 @@ def handle_register_entity(self, message: Message):
479488 e for e in self .registered_entities
480489 if not (e .get ("name" ) == name and e .get ("lang" ) == lang )]
481490 self .registered_entities .append ({"name" : name , "lang" : lang })
482- self .containers [lang ]. add_entity ( name , samples )
491+ self ._container_add_entity ( self . containers [lang ], name , samples )
483492
484493 def _intent_langs (self , message : Message ) -> List [str ]:
485494 """Resolve which container langs a deregister/enable/disable targets.
@@ -539,20 +548,20 @@ def handle_disable_intent(self, message: Message):
539548 intent_name = message .data .get ("intent_name" )
540549 name = self ._internal_name (skill_id , intent_name )
541550 for lang in self ._intent_langs (message ):
542- samples = self .containers [lang ]. intent_samples . get ( name )
551+ samples = self ._container_get_intent_samples ( self . containers [lang ], name )
543552 if samples is not None :
544553 # retain the live samples so a legacy-registered intent (which
545554 # never populated ``_template_samples``) can still be re-armed
546555 self ._disabled_intents [(lang , name )] = list (samples )
547- self .containers [lang ]. remove_intent ( name )
556+ self ._container_remove_intent ( self . containers [lang ], name )
548557
549558 def handle_enable_intent (self , message : Message ):
550559 """OVOS-INTENT-4 §8.5 — re-arm a previously disabled intent."""
551560 skill_id = message .data .get ("skill_id" )
552561 intent_name = message .data .get ("intent_name" )
553562 name = self ._internal_name (skill_id , intent_name )
554563 for lang in self ._intent_langs (message ):
555- if name in self .containers [lang ]. intent_samples :
564+ if self ._container_has_intent ( self . containers [lang ], name ) :
556565 self ._disabled_intents .pop ((lang , name ), None )
557566 continue # already enabled, no-op
558567 # prefer the samples stashed at disable time (works for both the
@@ -561,7 +570,7 @@ def handle_enable_intent(self, message: Message):
561570 samples = (self ._disabled_intents .pop ((lang , name ), None )
562571 or self ._template_samples .get ((lang , name )))
563572 if samples :
564- self .containers [lang ]. add_intent ( name , samples )
573+ self ._container_add_intent ( self . containers [lang ], name , samples )
565574
566575 def calc_intent (self , utterances : List [str ], lang : str = None ,
567576 message : Optional [Message ] = None ) -> Optional [PadaciosoIntent ]:
@@ -828,6 +837,21 @@ def _container_has_intent(self, container: DomainIntentContainer,
828837 return False
829838 return name in getattr (sub , "intent_samples" , {})
830839
840+ def _container_exclude_keywords (self , container : DomainIntentContainer ,
841+ name : str , keywords : List [str ]) -> None :
842+ domain = self ._domain_of (name )
843+ sub = container .domains .get (domain )
844+ if sub is not None :
845+ sub .exclude_keywords (name , keywords )
846+
847+ def _container_get_intent_samples (self , container : DomainIntentContainer ,
848+ name : str ) -> Optional [List [str ]]:
849+ domain = self ._domain_of (name )
850+ sub = container .domains .get (domain )
851+ if sub is None :
852+ return None
853+ return getattr (sub , "intent_samples" , {}).get (name )
854+
831855 # ------------------------------------------------------------------
832856 # Matching - delegate to DomainIntentContainer.calc_intent
833857 # ------------------------------------------------------------------
0 commit comments