@@ -322,6 +322,142 @@ async def search_by_coordinates(
322322 """Search for regions and paths at or near specific coordinates"""
323323 return await self .tools .search_by_coordinates (x = x , y = y , radius = radius )
324324
325+ @agent .tool
326+ async def analyze_region (
327+ ctx : RunContext [EditorContext ],
328+ region_id : int ,
329+ include_paths : bool = True
330+ ) -> Dict [str , Any ]:
331+ """Analyze a wilderness region by ID to get terrain, exits, and environmental data"""
332+ return await self .tools .analyze_region (region_id = region_id , include_paths = include_paths )
333+
334+ @agent .tool
335+ async def analyze_complete_terrain_map (
336+ ctx : RunContext [EditorContext ],
337+ center_x : int ,
338+ center_y : int ,
339+ radius : int = 5 ,
340+ include_regions : bool = True ,
341+ include_paths : bool = True
342+ ) -> Dict [str , Any ]:
343+ """Generate complete wilderness map including base terrain PLUS region and path overlays"""
344+ return await self .tools .analyze_complete_terrain (
345+ center_x = center_x ,
346+ center_y = center_y ,
347+ radius = radius
348+ )
349+
350+ @agent .tool
351+ async def find_static_wilderness_room (
352+ ctx : RunContext [EditorContext ],
353+ x : Optional [int ] = None ,
354+ y : Optional [int ] = None ,
355+ vnum : Optional [int ] = None
356+ ) -> Dict [str , Any ]:
357+ """Find static wilderness room at coordinates or by VNUM"""
358+ if vnum is not None :
359+ return await self .tools .find_static_wilderness_room (x = None , y = None , vnum = vnum )
360+ else :
361+ return await self .tools .find_static_wilderness_room (x = x , y = y )
362+
363+ @agent .tool
364+ async def generate_hints_from_description (
365+ ctx : RunContext [EditorContext ],
366+ region_vnum : Optional [int ] = None ,
367+ description : Optional [str ] = None ,
368+ region_name : Optional [str ] = None ,
369+ target_hint_count : int = 15 ,
370+ include_profile : bool = True
371+ ) -> Dict [str , Any ]:
372+ """Generate categorized hints for dynamic descriptions from region description"""
373+ return await self .tools .generate_region_hints (
374+ region_vnum = region_vnum ,
375+ description = description ,
376+ region_name = region_name ,
377+ target_hint_count = target_hint_count ,
378+ include_profile = include_profile
379+ )
380+
381+ @agent .tool
382+ async def store_region_hints (
383+ ctx : RunContext [EditorContext ],
384+ region_vnum : int ,
385+ hints : List [Dict [str , Any ]],
386+ profile : Optional [Dict [str , Any ]] = None
387+ ) -> Dict [str , Any ]:
388+ """Store generated hints in the database for a region"""
389+ return await self .tools .store_region_hints (
390+ region_vnum = region_vnum ,
391+ hints = hints ,
392+ profile = profile
393+ )
394+
395+ @agent .tool
396+ async def get_region_hints (
397+ ctx : RunContext [EditorContext ],
398+ region_vnum : int ,
399+ category : Optional [str ] = None ,
400+ active_only : bool = True
401+ ) -> Dict [str , Any ]:
402+ """Retrieve existing hints for a region from the database"""
403+ return await self .tools .get_region_hints (
404+ region_vnum = region_vnum ,
405+ category = category ,
406+ active_only = active_only
407+ )
408+
409+ @agent .tool
410+ async def update_region_description (
411+ ctx : RunContext [EditorContext ],
412+ vnum : int ,
413+ region_description : Optional [str ] = None ,
414+ description_style : Optional [str ] = None ,
415+ description_length : Optional [str ] = None ,
416+ has_historical_context : Optional [bool ] = None ,
417+ has_resource_info : Optional [bool ] = None ,
418+ has_wildlife_info : Optional [bool ] = None ,
419+ has_geological_info : Optional [bool ] = None ,
420+ has_cultural_info : Optional [bool ] = None ,
421+ description_quality_score : Optional [float ] = None ,
422+ requires_review : Optional [bool ] = None ,
423+ is_approved : Optional [bool ] = None
424+ ) -> Dict [str , Any ]:
425+ """Update the description and metadata for an existing region"""
426+ return await self .tools .update_region_description (
427+ vnum = vnum ,
428+ region_description = region_description ,
429+ description_style = description_style ,
430+ description_length = description_length ,
431+ has_historical_context = has_historical_context ,
432+ has_resource_info = has_resource_info ,
433+ has_wildlife_info = has_wildlife_info ,
434+ has_geological_info = has_geological_info ,
435+ has_cultural_info = has_cultural_info ,
436+ description_quality_score = description_quality_score ,
437+ requires_review = requires_review ,
438+ is_approved = is_approved
439+ )
440+
441+ @agent .tool
442+ async def analyze_description_quality (
443+ ctx : RunContext [EditorContext ],
444+ vnum : int ,
445+ suggest_improvements : bool = True
446+ ) -> Dict [str , Any ]:
447+ """Analyze the quality and completeness of a region's description"""
448+ # Need to check if this method exists in WildernessTools
449+ if hasattr (self .tools , 'analyze_description_quality' ):
450+ return await self .tools .analyze_description_quality (
451+ vnum = vnum ,
452+ suggest_improvements = suggest_improvements
453+ )
454+ else :
455+ # Fallback to MCP call directly
456+ return await self .tools .mcp .call_tool (
457+ "analyze_description_quality" ,
458+ {"vnum" : vnum , "suggest_improvements" : suggest_improvements }
459+ )
460+
325461 return agent
326462
327463 def _convert_tool_calls_to_actions (self , result ) -> List [ChatAction ]:
0 commit comments