[docs]asyncdefadd_agent(INDEX_DIR:Path,index_name:str,agent:AgentEntry):"""Add an agent to an index"""try:index_dir=INDEX_DIR/index_nameindex_file=index_dir/'index.json'ifnotindex_file.exists():returnJSONResponse({'success':False,'message':'Index not found'})try:agent_data=awaitload_agent_data(agent.name)exceptFileNotFoundErrorase:returnJSONResponse({'success':False,'message':str(e)})exceptValueErrorase:returnJSONResponse({'success':False,'message':str(e)})agent_data['added_at']=datetime.now().isoformat()withopen(index_file,'r')asf:index_data=json.load(f)ifany(a['name']==agent.nameforainindex_data['agents']):returnJSONResponse({'success':False,'message':'Agent already in index'})# If agent has a persona, copy persona filesif'persona'inagent_dataandisinstance(agent_data['persona'],dict):persona_name=agent_data['persona'].get('name')ifpersona_name:persona_source=Path('personas/local')/persona_nameifnotpersona_source.exists():persona_source=Path('personas/shared')/persona_nameifpersona_source.exists():persona_target=index_dir/'personas'/persona_nameifpersona_target.exists():shutil.rmtree(persona_target)persona_target.parent.mkdir(parents=True,exist_ok=True)shutil.copytree(persona_source,persona_target)index_data['agents'].append(agent_data)withopen(index_file,'w')asf:json.dump(index_data,f,indent=2)returnJSONResponse({'success':True,'data':index_data})exceptExceptionase:raiseHTTPException(status_code=500,detail=str(e))
[docs]asyncdefremove_agent(INDEX_DIR:Path,index_name:str,agent_name:str):"""Remove an agent from an index"""try:index_dir=INDEX_DIR/index_nameindex_file=index_dir/'index.json'ifnotindex_file.exists():returnJSONResponse({'success':False,'message':'Index not found'})withopen(index_file,'r')asf:index_data=json.load(f)# Get agent data before removal to handle persona cleanupagent_data=next((aforainindex_data['agents']ifa['name']==agent_name),None)ifagent_dataand'persona'inagent_data:persona_name=agent_data['persona'].get('name')ifpersona_name:persona_dir=index_dir/'personas'/persona_nameifpersona_dir.exists():# Check if persona is used by other agents before removingother_agents_with_persona=[aforainindex_data['agents']ifa['name']!=agent_nameanda.get('persona',{}).get('name')==persona_name]ifnotother_agents_with_persona:shutil.rmtree(persona_dir)# Remove from index dataindex_data['agents']=[aforainindex_data['agents']ifa['name']!=agent_name]withopen(index_file,'w')asf:json.dump(index_data,f,indent=2)returnJSONResponse({'success':True,'data':index_data})exceptExceptionase:raiseHTTPException(status_code=500,detail=str(e))