
    /jF
                    h    d Z ddlmZ ddlmZ ddlZddlmZ ddlm	Z	m
Z
mZmZ  G d d          ZdS )	u  WorldBuilder:加载并校验一组 manifest(地点/物体/角色),供雾鸦岛运行时(server.live2 → runtime.engine)装载世界。

准备好 manifest 目录 → from_directory() 解析 → validate_refs() 准入校验。素材线用同一批 manifest 的 art 段生成精灵图。
(旧的 build()→AgentMind 入世路径已随重复 agent 实现一并移除;当前世界由 runtime.engine.WorldEngine 直接从 manifest 构建。)
    )annotations)PathN)load_manifest)CharacterManifestManifestErrorObjectManifestPlaceManifestc                  >    e Zd ZddZddZedd            Zdd	Zd
S )WorldBuilderreturnNonec                0    i | _         i | _        i | _        d S N)
charactersobjectsplaces)selfs    3/root/genesis-world/src/genesis/manifest/builder.py__init__zWorldBuilder.__init__   s    8:2402    c                    | j         | j        | j        d|j                 }|j        |v rt          d|j         d|j                   |||j        <   d S )N)	characterobjectplaceu
   重复的 z id:)r   r   r   kindidr   )r   manifestbuckets      r   addzWorldBuilder.add   sm    l[
 
 -	
 ;&   MX] M M M MNNN&x{r   path
str | Path'WorldBuilder'c                .    |             }t          |          }t          d |                    d          D                       }|D ]L}t          j        |                    d                    }|                    t          |                     M|S )u4   递归加载目录下所有 *.yaml/*.yml manifest。c              3  B   K   | ]}|                                 |V  d S r   )is_file).0ps     r   	<genexpr>z.WorldBuilder.from_directory.<locals>.<genexpr>+   s/      FFQ!))++FqFFFFFFr   z*.y*mlzutf-8)encoding)r   sortedrglobyaml	safe_load	read_textr   r   )clsr    builderrootfilesfdatas          r   from_directoryzWorldBuilder.from_directory&   s     #%%DzzFF$**X"6"6FFFFF 	- 	-A>!++w+"?"?@@DKKd++,,,,r   c                   d | j                                         D             fdD             }|rt          d|           | j                                        D ]\}|j        D ]%}|| j        vrt          d|j         d|           &|j        D ]%}|| j        vrt          d|j         d|           &]| j                                         D ]0}|j        | j        vr t          d|j         d|j         d	          1d
S )uW   准入:跨实体引用必须成立(物体/邻接/出生地都得存在,姓名唯一)。c                    g | ]	}|j         
S  )name)r&   cs     r   
<listcomp>z.WorldBuilder.validate_refs.<locals>.<listcomp>3   s    :::A:::r   c                F    h | ]}                     |          d k    |S )   )count)r&   nnamess     r   	<setcomp>z-WorldBuilder.validate_refs.<locals>.<setcomp>4   s-    888qU[[^^a%7%7%7%7%7r   u2   角色姓名重复(用作 agent 标识,须唯一):u   地点 u    引用了不存在的物体 u    邻接了不存在的地点 u   角色 u    的出生地 u
    不存在N)r   valuesr   r   r   r   adjacentstart_location)r   dupespmoidadjcmr@   s         @r   validate_refszWorldBuilder.validate_refs1   sz   ::!7!7!9!9:::8888E888 	^ \UZ \ \]]]+$$&& 	] 	]Bz ] ]dl**'(["%([([VY([([\\\ +{ ] ]dk))'(["%([([VY([([\\\ *] /((** 	b 	bB 33#$`be$`$`2CT$`$`$`aaa 4	b 	br   N)r   r   )r    r!   r   r"   )__name__
__module____qualname__r   r   classmethodr5   rJ   r8   r   r   r   r      sv        3 3 3 3
' ' ' '    [b b b b b br   r   )__doc__
__future__r   pathlibr   r,   genesis.manifest.loaderr   genesis.manifest.schemar   r   r   r	   r   r8   r   r   <module>rT      s     # " " " " "        1 1 1 1 1 1           *b *b *b *b *b *b *b *b *b *br   