[docs]@dataclass(slots=True)classScriptManager:"""Runtime template lookup and scope-group facade for story."""template_registry:TemplateRegistryworld_scope_provider:ScopeProvider|None=Nonedeffind_template(self,reference:str|UUID|Selector|None)->Any|None:"""Resolve one template by selector, uid, identifier, or label."""ifreferenceisNone:returnNoneifisinstance(reference,Selector):returnself.template_registry.find_one(reference)ifisinstance(reference,UUID):returnself.template_registry.get(reference)key=str(reference)found=self.template_registry.find_one(Selector.from_identifier(key))iffoundisnotNone:returnfoundreturnself.template_registry.find_one(Selector(label=key))deffind_templates(self,selector:Selector|None=None)->list[Any]:"""Return templates matching selector, or all templates when omitted."""ifselectorisNone:returnlist(self.template_registry.values())returnlist(selector.filter(self.template_registry.values()))defget_template_scope_groups(self,*,caller:Any,graph:Any=None,lineage_ids:Iterable[UUID]=(),)->list[list[Any]]:"""Return template groups ordered from nearest scope to broadest scope."""groups:list[list[Any]]=[]seen_ids:set[UUID]=set()def_add_group(values:Iterable[Any])->None:bucket:list[Any]=[]forvalueinvalues:uid=getattr(value,"uid",None)ifuidisNoneoruidinseen_ids:continueseen_ids.add(uid)bucket.append(value)ifbucket:groups.append(bucket)fortemplate_idinlineage_ids:template=self.template_registry.get(template_id)iftemplateisNone:continuevalues:list[Any]=[template]members=getattr(template,"members",None)ifcallable(members):values.extend(list(members()))_add_group(values)_add_group(self.template_registry.values())ifcallable(self.world_scope_provider):world_groups=self.world_scope_provider(caller=caller,graph=graph)or()forgroupinworld_groups:_add_group(group)returngroups