
    i                        U d Z ddl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 dZdZdZdZ ee      j#                         j$                  d	   Z ed
      Zedz  Zedz  Zedz  Zddededz  defdZ eee      j#                         Z eee      j#                         Z eee      j#                         Z G d d      Zi Ze
eef   ed<   deez  defdZ y)zUnified function management.    N)Path)AnyCallableDictOptional_dynamic_functionsMAC_FUNCTIONS_DIRMAC_EDGE_FUNCTIONS_DIR MAC_EDGE_PROCESSOR_FUNCTIONS_DIR   	functionsfunction_callingedgeedge_processordefaultenv_varreturnc                     |rt         j                  j                  |      nd}|rt        |      j	                         S | j                         r| S t        | z  S )z<Resolve a directory path with optional environment override.N)osenvirongetr   
expanduseris_absolute
_REPO_ROOT)r   r   overrides      C/Users/bowang/.openclaw/workspace/ChatDev/utils/function_manager.py_resolve_dirr      sJ    *1rzz~~g&tHH~((**    c                       e Zd ZdZddeez  ddfdZddZdedefdZd	ede	e
   fd
Zd	edefdZd	edefdZdeee
f   fdZddZy)FunctionManagerzOUnified function manager for loading and managing functions across the project.functions_dirr   Nc                 @    t        |      | _        i | _        d| _        y )NF)r   r!   r   _loaded)selfr!   s     r   __init__zFunctionManager.__init__%   s    !-0.0r   c                    | j                   ry| j                  j                         st        d| j                         | j                  j	                  d      D ]i  }|j
                  j                  d      s|j
                  dk(  r/d|j                  v r>| j                  |      }	 t        j                  j                  ||      }||j                  t        j                  j                  |      }|j                  j                  |       |j                         }t!        j"                  |t         j$                        D ]z  \  }}|j                  d      rt'        |dd      |j(                  k7  r:t'        |dd      }|r#t+        |j,                        j                         nd}	|	|k7  rl|| j.                  |<   | l d| _         y# t0        $ r}
t3        d	| d
|
        Y d}
~
d}
~
ww xY w)z3Load all Python functions from functions directory.Nz$Functions directory does not exist: z*.py_z__init__.py__pycache__
__module____code__zError loading module z: T)r#   r!   exists
ValueErrorrglobname
startswithparts_build_module_name	importlibutilspec_from_file_locationloadermodule_from_specexec_moduleresolveinspect
getmembers
isfunctiongetattr__name__r   co_filenamer   	Exceptionprint)r$   filemodule_namespecmodulecurrent_filer.   objcodesource_pathes              r   load_functionszFunctionManager.load_functions*   s   <<!!((*CDDVDVCWXYY&&,,V4Dyy##C(DII,F

*11$7KB ~~==k4P<4;;#6"88>''/#||~!(!3!3FG<N<N!OID#s+ sL$76??J&sJ=JNd4+;+;&<&D&D&FTX&,6$+.DNN4( "P% 5>   B-k]"QC@AABs   +.GC+G	G5G00G5filepathc                     |j                  | j                        }dj                  |j                  d      j                        xs d}t        t        |j                                     dz  d}t         d| d| S )z0Create a unique module name for a function file.r'    rD   l    X.)	relative_tor!   joinwith_suffixr0   abshashas_posix_MODULE_PREFIX)r$   rK   relativer0   unique_suffixs        r   r1   z"FunctionManager._build_module_nameS   sv    ''(:(:;--b1778DHtH$5$5$789JFqI !5'=/::r   r.   c                 p    | j                   s| j                          | j                  j                  |      S )zGet a function by name.)r#   rJ   r   r   r$   r.   s     r   get_functionzFunctionManager.get_functionZ   s*    ||!~~!!$''r   c                 V    | j                   s| j                          || j                  v S )zCheck if a function exists.)r#   rJ   r   rZ   s     r   has_functionzFunctionManager.has_function`   s$    ||!t~~%%r   c                 V    | j                  |      }|t        d| d       ||i |S )z-Call a function by name with given arguments.z	Function z
 not found)r[   r,   )r$   r.   argskwargsfuncs        r   call_functionzFunctionManager.call_functionf   s;      &<yj9::T$V$$r   c                 n    | j                   s| j                          | j                  j                         S )zList all available functions.)r#   rJ   r   copyr$   s    r   list_functionszFunctionManager.list_functionsm   s(    ||!~~""$$r   c                 f    | j                   j                          d| _        | j                          y)z2Reload all functions from the functions directory.FN)r   clearr#   rJ   re   s    r   reload_functionsz FunctionManager.reload_functionss   s%    r   )r   )r   N)r=   r)   __qualname____doc__strr   r%   rJ   r1   r   r   r[   boolr]   r   rb   r   rf   ri    r   r   r    r    "   s    YcDj 4 
'R;4 ;C ;( ((); (& & &%# %3 %%S(] 3 %r   r    _function_managersr!   c                     t        |       j                         }t        j                  |      }|t	        |      }|t        |<   |S )zCGet or create the global function manager instance for a directory.)r   r8   ro   r   r    )r!   	directorymanagers      r   get_function_managerrs   ~   sD    ]#++-I $$Y/G!),(/9%Nr   )N)!rk   importlib.utilr2   r9   r   pathlibr   typingr   r   r   r   rV   _FUNCTION_CALLING_ENV_EDGE_FUNCTION_ENV_EDGE_PROCESSOR_FUNCTION_ENV__file__r8   parentsr   _DEFAULT_FUNCTIONS_ROOT_DEFAULT_FUNCTION_CALLING_DIR_DEFAULT_EDGE_FUNCTION_DIR_DEFAULT_EDGE_PROCESSOR_DIRrl   r   FUNCTION_CALLING_DIREDGE_FUNCTION_DIREDGE_PROCESSOR_FUNCTION_DIRr    ro   __annotations__rs   rn   r   r   <module>r      s   "   	  0 0%+ - A (^##%--a0
{+  7:L L 4v= 58HH  $  t  t   $$ACXYaac  !;=OPXXZ *+FHdemmo U Ur 35 D./ 4d
  r   