
    i              
          d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ dZ G d d	e      Z ed
       G d d             Zdee
eef      dz  de	e   fdZeddee   dee   dee   fdZdee   dedeeef   deeef   fdZde
eef   de	e   fdZdeeef   defdZ	 d eddee
eef      dz  dee   deeef   fdZg dZy)!z3Schema exporter for dynamic configuration metadata.    N)	dataclass)AnyDictIterableListMappingSequenceType)
BaseConfig)DesignConfigz0.1.0c                       e Zd ZdZy)SchemaResolutionErrorz9Raised when breadcrumbs fail to resolve to a config node.N)__name__
__module____qualname____doc__     B/Users/bowang/.openclaw/workspace/ChatDev/utils/schema_exporter.pyr   r      s    Cr   r   T)frozenc                   ~    e Zd ZU dZeed<   dZedz  ed<   dZedz  ed<   e	de
eef   dd fd       Zdeeef   fd	Zy)

Breadcrumbz%Describes one hop in the config tree.nodeNfieldvaluedatareturnc                 F   |j                  d      rt        |j                  d            nd}|st        d      |j                  d      }|t        |      }|j                  d      }|t        |t              st        d      |j                  d      } | |||      S )	Nr    zbreadcrumb entry missing 'node'r   indexz0breadcrumb 'index' must be integer when providedr   r   r   r   )getstrr   
isinstanceint)clsr   r   r   r    r   s         r   from_mappingzBreadcrumb.from_mapping   s    (,(8s488F#$b'(IJJ!JE!Zs%;'(Z[[!E77r   c                     d| j                   i}| j                  | j                  |d<   | j                  | j                  |d<   |S )Nr   r   r   r!   )selfpayloads     r   to_jsonzBreadcrumb.to_json(   sE    #)499"5::!#zzGG::!#zzGGr   )r   r   r   r   r#   __annotations__r   r   r   classmethodr   r'   r   r+   r   r   r   r   r      sc    /
IE3:E3:8S 1 8l 8 8c3h r   r   rawr   c                 Z    | sg S | D cg c]  }t         j                  |       c}S c c}w N)r   r'   )r.   items     r   _normalize_breadcrumbsr2   1   s-    	69:cdJ##D)c:::s   (root_clsbreadcrumbsr4   c                   |}| D ]  }|j                   |j                  k7  r&t        d|j                    d|j                   d      |j                  O|j	                  |j                  |j
                        }|i|j                         j                  |j                        }|r|j                  &t        d|j                   d|j                   d      |j                  }|} |S )Nzbreadcrumb node 'z!' does not match current config ''zfield 'z' on z is not navigable)	r   r   r   r   resolve_childr   field_specsr"   child)r5   r4   current_clscrumb	child_clsspecs         r   _resolve_config_classr?   7   s    
 %-K::---'#EJJ</PQ\QeQePffgh  ;;--ekk5;;G	**,00=D4::-+ekk]%0D0D/EEVW  

I   r   
config_clsname	spec_dictc                     ||   }|j                         }| j                         j                         D cg c]1  \  }}|j                  |k(  r|j                         |j                  d3 }}}|r||d<   |S c c}}w )N)childKey	childNodechildRoutes)r+   child_routesitemsr   r   )r@   rA   rB   
field_specr   keytargetroutess           r   _serialize_fieldrM   P   s    4JD &224::<
 =KC99	 	
 =   $]Ks   6A9specsc           	          t        | j                               }|D cg c]  \  }}t        |dd      s| }}}|D cg c]  \  }}t        |dd      r| }}}||z   S c c}}w c c}}w )zIReturn field names with required ones first while keeping relative order.requiredF)listrH   getattr)rN   rH   rA   r>   required_namesoptional_namess         r   _ordered_field_namesrU   `   sp     E-2WUztTgdJPU6VdUNW-2[UztT'$
TY:ZdUN[N** X[s   A#A#A)A)r*   c                     t        j                  | ddt              }t        j                  |j                  d            j                         S )NTF)	sort_keysensure_asciidefaultzutf-8)jsondumpsr#   hashlibsha1encode	hexdigest)r*   
serializeds     r   _hash_payloadra   i   s:    Gt%QTUJ<<
))'23==??r   breadcrumbs_rawc          	         t        |       }t        ||      }|j                         }|j                         }t	        |      }|D cg c]  }t        |||       }}t        |j                  ||j                  D 	cg c]  }	|	j                          c}	|D 
cg c]  }
|
j                          c}
d}t        |j                  |d   d      |d<   |S c c}w c c}	w c c}
w )zHReturn a JSON-serializable schema response for the provided breadcrumbs.r3   )schemaVersionr   fieldsconstraintsr5   r5   )r   r5   cacheKey)r2   r?   collect_schemar9   rU   rM   SCHEMA_VERSIONr   rf   r+   ra   )rb   r4   r5   
target_clsschema_noder9   ordered_fieldsrA   fields_payload
constraintr<   responses               r   build_schema_responserp   n   s     )9K&{XFJ++-K((*K)+6NR`aR`$&z4ER`Na (   ?J?V?VW?V
**,?VW5@A[E[AH )+2B2BS[\iSj)klHZO b XAs   C=C
C )r   r   rp   r0   )r   r\   rZ   dataclassesr   typingr   r   r   r   r   r	   r
   entity.configsr   entity.configs.graphr   ri   
ValueErrorr   r   r#   r2   r?   rM   rU   ra   rp   __all__r   r   r   <module>rw      s   9   ! E E E % -DJ D $  <;c): ;d B ;tJGW ; ".*% : 
*	2j!1  cSVh \`adfiai\j  +S 1 +d3i +@4S> @c @ ;? ".gc3h/047 : 
#s(^	2r   