
    Si(                    J   d dl mZ d dlm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 	 d dlZdZ ee      j%                         j&                  d   d	z  d
z  ZdddZe G d d             Ze G d d             Ze G d d             Z G d d      Zy# e$ r dZdZY qw xY w)    )annotations)	dataclassN)Path)AnyDictListOptionalSetTF   verifierzschema.jsonc                    | xs t         }|j                  dd      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nrutf-8)encoding)SCHEMA_PATHopenjsonload)schema_pathpathhandles      @/home/nelsen/Projects/HRI/orchestrator/src/planner/dag_parser.pyload_schemar      s?    %+D	3	) !Vyy ! ! !s	   =Ac                  4    e Zd ZU ded<   dZded<   dZded<   y)
ParseErrorstrmessageNOptional[str]detailshint)__name__
__module____qualname____annotations__r   r         r   r   r      s    L!G]!D-r&   r   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   y)	PlanGraphDict[str, Any]planzList[Dict[str, Any]]stepszDict[str, Dict[str, Any]]step_lookupzDict[str, Set[str]]dependencieschildren	List[str]entry_stepsNr!   r"   r#   r$   r%   r&   r   r(   r(   "   s&    
**%%!!r&   r(   c                  ,    e Zd ZU ded<   ded<   ded<   y)ParseResultboolokzOptional[PlanGraph]
plan_graphzOptional[ParseError]errorNr1   r%   r&   r   r3   r3   ,   s    H##r&   r3   c                  J    e Zd Zdd	dZd
ddZddZddZddZedd       Z	y)	DAGParserNc                d    |xs t         | _        t        | j                        | _        || _        y N)r   r   r   schemastrict_intent)selfr   r=   s      r   __init__zDAGParser.__init__4   s)    &5+!$"2"23*r&   c                r   | j                  |      }t        |t              rt        dd |      S | j	                  |      }|r,t        dd t        ddj                  |d d       d            S t        j                  |      }|j                  d      sA| j                  j                  d	i       j                  di       j                  d
d      }||d<   |M| j                  rA|j                  d      |k7  r-t        dd t        dd|j                  d       dd            S |j                  d      xs g }|st        dd t        dd            S g }|D ]r  }	d|	vs|	d   g |	d<   t        |	d   t              s/t        dd t        dd|	j                  d       dd            c S |j                  |	j                  d             t |D 
ch c]  }
|j                  |
      dkD  s|
 }}
|r2t        dd t        ddj                  t        |            d            S |j                  d      dk(  rAt        dt!        |            D ])  }||   j                  d      r||dz
     d   g||   d<   + |D 
ch c]  }
|
|
	 }}
|D ]Q  }	|	j                  dg       D ]:  }||vst        dd t        dd|	j                  d       d | dd!            c c S  S i }|D 
ci c]  }
|
t#                }}
i }|D ]\  }	|	d   }
|	||
<   t#        |	j                  dg             }|||
<   |D ]+  }|j%                  |t#                     j'                  |
       - ^ |j)                         D 
cg c]
  \  }
}|r	|
 }}
}t+        ||||||"      }t        d#|d       S c c}
w c c}
w c c}
w c c}}
w )$NF)r5   r6   r7   zSchema validation failed.z;    z.Return a JSON object that matches schema.json.r   r   r    workflow_topology
propertiesdefaultDAGintentz'Plan intent does not match user intent.zPlan intent=""z.Set intent to the original user intent string.r+   zPlan has no steps.z&Provide at least one step in the plan.)r   r    r-   z!Step dependencies must be a list.z	step_id="step_idz-Set dependencies to [] or a list of step_ids.r   zDuplicate step_id values found.z, zEnsure each step_id is unique.
SEQUENTIALz%Dependency refers to unknown step_id.z" dependency="z3Ensure dependencies reference valid step_id values.)r*   r+   r,   r-   r.   r0   T)_parse_json
isinstancer   r3   _validate_schemajoincopydeepcopygetr<   r=   listappendcountsortedrangelenset
setdefaultadditemsr(   )r>   raw_jsonexpected_intentdataschema_errorsr*   rE   r+   step_idssteprI   
duplicatesindexstep_id_setdepr-   r.   r,   depsparentr0   r6   s                         r   parsezDAGParser.parse9   s3   )dJ'%DEE--d3 7 IImBQ&78I  }}T"xx+,b1("-Y& 
 )0D$%&4+=+=xx!_4"#$ I"/0B/C1 EM  !'R 0A  ! 	1DT)T.-A-I')^$d>2D9"#$ C"+DHHY,?+@ BL  OODHHY/0	1 .6U'9PST9TgU
U = IIfZ&899  88'(L8q#e*- QU|''749%!)4DY4O3PE%L0Q /7N7':MwNN 	Dxx3 
k)& #'($K&/0C/DNSVRWWX$Y!V 
	 -/GR(SG#%(S(S13 	@D9oG#'K txx34D$(L! @##FCE266w?@	@ 5A4F4F4HU=7DPTwUU#%#

 dzFFi V" O )T Vs*   N$,N$?N)N))N.3
N3>N3c                z   t        |t        t        f      r|j                  dd      }t        |t              r	 t        j                  |      S t        |t              r|S t        ddt        |      j                   d	      S # t
        j                  $ r!}t        dt	        |      d      cY d }~S d }~ww xY w)
Nr   replace)errorszInvalid JSON.z+Return a JSON object, not markdown or text.rB   z%Planner output must be a JSON object.ztype=zReturn a JSON object only.)rL   bytes	bytearraydecoder   r   loadsJSONDecodeErrorr   dicttyper!   )r>   r\   excs      r   rK   zDAGParser._parse_json   s    h	 23wyAHh$zz(++ h%O;DN3345-
 	
 '' !+HF s   B B:B5/B:5B:c                   t        |t              sdgS t        r[t        j                  | j
                        }t        |j                  |      d       }|D cg c]  }| j                  |       c}S | j                  |      S c c}w )Nz!Top-level JSON must be an object.c                ,    t        | j                        S r;   )rR   r   )errs    r   <lambda>z,DAGParser._validate_schema.<locals>.<lambda>   s    chh r&   )key)
rL   rq   _HAS_JSONSCHEMA
jsonschemaDraft7Validatorr<   rU   iter_errors_format_schema_error_basic_validate)r>   r^   	validatorrk   r7   s        r   rM   zDAGParser._validate_schema   sw    $%788"224;;?II11$7=WXFBHID--e4II##D)) Js   Bc           	        g }| j                   j                  dg       }|D ]  }||vs|j                  d| d        d|v r0t        |j                  d      t              s|j                  d       d|v r0t        |j                  d      t              s|j                  d       d|v r0t        |j                  d      t              s|j                  d	       d
|v rT| j                   j                  di       j                  d
i       j                  dg       }|d
   |vr|j                  d       |j                  d      }|#t        |t
              s|j                  d       |S t        |t
              rt        |      D ]  \  }}t        |t              s|j                  d| d       -dD ]  }||vs|j                  d| d| d       ! d|v r4t        |j                  d      t              s|j                  d| d       d|v r4t        |j                  d      t              s|j                  d| d       d|v r4t        |j                  d      t              s|j                  d| d       |j                  d      }	| j                   j                  di       j                  di       j                  di       j                  di       j                  di       j                  dg       }
|	r|	|
vr|j                  d| d|	 d       |j                  d      }|t        |t
              r|j                  d| d        |S ) NrequiredzMissing required field "z".rG   z Field "intent" must be a string.plan_idz!Field "plan_id" must be a string.response_textz'Field "response_text" must be a string.rC   rD   enumz0workflow_topology must be "DAG" or "SEQUENTIAL".r+   zField "steps" must be a list.zStep z must be an object.)rI   rr   
agent_roleactionz
 missing "rI   z step_id must be a string.r   z agent_role must be a string.r   z action must be a string.rr   r[   z type "z" is invalid.r-   z dependencies must be a list.)r<   rQ   rS   rL   r   rR   	enumeraterq   )r>   r^   rk   r   fieldallowedr+   idxra   	step_typeallowed_typesr-   s               r   r~   zDAGParser._basic_validate   s   ;;??:r2 	DED  8rBC	D tJtxx/A3$GMM<=Z0CS%IMM=>d":dhh6OQT+UMMCD$&b1("-VR 
 '(7PQ!Zt%<MM9:MeT"&u- N	T!$-MME#.A"BCH HED(cU*UG2&FGH $Z8KS-QMME#.H"IJ4'
488L;QSV0WMME#.K"LMt#Jtxx7I3,OMME#.G"HI HHV,	KKOOL"5S"%S"%Sr*S_S_  -!?MME#gi["NO#xx7+J|T4RMME#.K"LM;N> r&   c                x    dj                  d | j                  D              }|r| dnd}| | j                   S )N.c              3  2   K   | ]  }t        |        y wr;   )r   ).0items     r   	<genexpr>z1DAGParser._format_schema_error.<locals>.<genexpr>  s     9dD	9s   z:  )rN   r   r   )r7   r   locations      r   r}   zDAGParser._format_schema_error  s<    xx9ejj99"&dV2;BEMM?++r&   )NT)r   Optional[Path]r=   r4   returnNoner;   )r\   r   r]   r   r   r3   )r\   r   r   r   )r^   r)   r   r/   )r7   r   r   r   )
r!   r"   r#   r?   rh   rK   rM   r~   staticmethodr}   r%   r&   r   r9   r9   3   s3    +
uGn
.	*<| , ,r&   r9   r;   )r   r   r   r)   )
__future__r   dataclassesr   rO   r   pathlibr   typingr   r   r   r	   r
   rz   ry   	Exception__file__resolveparentsr   r   r   r(   r3   r9   r%   r&   r   <module>r      s    " !    1 1O 8n$$&..q1J>N!            a, a,M  JOs   B 	B"!B"