@@ -195,35 +195,46 @@ def normalize_provider_control(text: str) -> tuple[str, dict[str, Any]] | None:
195195 if not isinstance (value , dict ):
196196 return None
197197
198- executable_keys = {"action" , "args" , "arguments" , "command" , "tool" , "tool_calls" }
199- stack : list [Any ] = [value ]
200- while stack :
201- item = stack .pop ()
202- if isinstance (item , dict ):
203- if executable_keys & {str (key ).lower () for key in item }:
204- return None
205- stack .extend (item .values ())
206- elif isinstance (item , list ):
207- stack .extend (item )
208-
198+ executable_keys = {
199+ "action" , "args" , "arguments" , "command" , "commands" , "content" , "path" , "tool" , "tool_calls" ,
200+ }
209201 mode = str (value .get ("mode" ) or "" ).strip ().lower ()
210202 if mode == "plan" or value .get ("do_not_execute_until_approved" ) is True :
203+ if executable_keys & {str (key ).lower () for key in value }:
204+ return None
211205 steps = []
212206 for index , step in enumerate (value .get ("steps" ) or [], 1 ):
213207 if not isinstance (step , dict ):
214208 return None
209+ description = step .get ("description" ) or step .get ("details" ) or step .get ("title" )
210+ if not description :
211+ return None
215212 steps .append ({
216213 "id" : str (step .get ("id" ) or step .get ("step_id" ) or f"step-{ step .get ('step' , index )} " ),
217- "title" : step .get ("title" ) or f"Step { index } " ,
218- "description" : step .get ("description" ) or step .get ("details" ),
219- "acceptance" : step .get ("acceptance" ) or step .get ("acceptance_criteria" ),
214+ "title" : step .get ("title" ) or str (description )[:120 ],
215+ "description" : description ,
216+ "acceptance" : (
217+ step .get ("acceptance" ) or step .get ("acceptance_criteria" )
218+ or ["Step completed with observable evidence" ]
219+ ),
220220 })
221221 return "PlanProposal" , {
222222 "title" : value .get ("title" ) or value .get ("plan_name" ),
223- "summary" : value .get ("summary" ) or value .get ("overview" ),
223+ "summary" : value .get ("summary" ) or value .get ("overview" ) or value . get ( "goal" ) ,
224224 "assumptions" : value .get ("assumptions" ) or [],
225225 "steps" : steps ,
226226 }
227+
228+ stack : list [Any ] = [value ]
229+ while stack :
230+ item = stack .pop ()
231+ if isinstance (item , dict ):
232+ if executable_keys & {str (key ).lower () for key in item }:
233+ return None
234+ stack .extend (item .values ())
235+ elif isinstance (item , list ):
236+ stack .extend (item )
237+
227238 if mode == "ask" or value .get ("ask_user" ) is True :
228239 return "AskUser" , {"questions" : value .get ("questions" )}
229240 return None
0 commit comments