From 529040a86924d97b2dbb9513f57a8150333d42a0 Mon Sep 17 00:00:00 2001 From: Dhruvkumar-Microsoft Date: Wed, 22 Oct 2025 13:03:11 +0530 Subject: [PATCH 01/15] added extra logs --- src/backend/common/database/database_base.py | 1 + src/backend/v3/api/router.py | 9 ++++++++ src/backend/v3/callbacks/response_handlers.py | 22 ++++++++++++++++--- src/backend/v3/config/settings.py | 8 ++++++- .../v3/magentic_agents/common/lifecycle.py | 12 +++++++++- .../v3/magentic_agents/foundry_agent.py | 10 ++++++++- src/backend/v3/magentic_agents/proxy_agent.py | 6 ++--- .../orchestration/human_approval_manager.py | 16 ++++++++++---- .../v3/orchestration/orchestration_manager.py | 5 +++++ 9 files changed, 76 insertions(+), 13 deletions(-) diff --git a/src/backend/common/database/database_base.py b/src/backend/common/database/database_base.py index fe67c556c..cef6cc509 100644 --- a/src/backend/common/database/database_base.py +++ b/src/backend/common/database/database_base.py @@ -153,6 +153,7 @@ async def get_steps_for_plan(self, plan_id: str) -> List[Step]: @abstractmethod async def get_current_team(self, user_id: str) -> Optional[UserCurrentTeam]: """Retrieve the current team for a user.""" + pass @abstractmethod async def delete_current_team(self, user_id: str) -> Optional[UserCurrentTeam]: diff --git a/src/backend/v3/api/router.py b/src/backend/v3/api/router.py index a86b35c50..d216b6e2f 100644 --- a/src/backend/v3/api/router.py +++ b/src/backend/v3/api/router.py @@ -396,6 +396,9 @@ async def plan_approval( orchestration_config and human_feedback.m_plan_id in orchestration_config.approvals ): + # orchestration_config.approvals[human_feedback.m_plan_id] = ( + # human_feedback.approved + # ) orchestration_config.set_approval_result( human_feedback.m_plan_id, human_feedback.approved ) @@ -528,6 +531,9 @@ async def user_clarification( orchestration_config and human_feedback.request_id in orchestration_config.clarifications ): + # orchestration_config.clarifications[human_feedback.request_id] = ( + # human_feedback.answer + # ) # Use the new event-driven method to set clarification result orchestration_config.set_clarification_result( human_feedback.request_id, human_feedback.answer @@ -749,10 +755,12 @@ async def upload_team_config( ) # Validate search indexes + logger.info(f"πŸ” Validating search indexes for user: {user_id}") search_valid, search_errors = await team_service.validate_team_search_indexes( json_data ) if not search_valid: + logger.warning(f"❌ Search validation failed for user {user_id}: {search_errors}") error_message = ( f"Search index validation failed:\n\n{chr(10).join([f'β€’ {error}' for error in search_errors])}\n\n" f"Please ensure all referenced search indexes exist in your Azure AI Search service." @@ -768,6 +776,7 @@ async def upload_team_config( ) raise HTTPException(status_code=400, detail=error_message) + logger.info(f"βœ… Search validation passed for user: {user_id}") track_event_if_configured( "Team configuration search validation passed", {"status": "passed", "user_id": user_id, "filename": file.filename}, diff --git a/src/backend/v3/callbacks/response_handlers.py b/src/backend/v3/callbacks/response_handlers.py index 51a4e2e84..36c5775df 100644 --- a/src/backend/v3/callbacks/response_handlers.py +++ b/src/backend/v3/callbacks/response_handlers.py @@ -17,6 +17,8 @@ WebsocketMessageType, ) +logger = logging.getLogger(__name__) + def clean_citations(text: str) -> str: """Remove citation markers from agent responses while preserving formatting.""" @@ -42,6 +44,8 @@ def agent_response_callback(message: ChatMessageContent, user_id: str = None) -> # Get agent name to determine handling agent_name = message.name or "Unknown Agent" + + logger.info(f"πŸ€– Agent Response from '{agent_name}' for user: {user_id}") role = getattr(message, "role", "unknown") @@ -49,12 +53,17 @@ def agent_response_callback(message: ChatMessageContent, user_id: str = None) -> if user_id: try: if message.items and message.items[0].content_type == "function_call": + logger.info(f"πŸ”§ Tool calls detected from agent: {agent_name}") final_message = AgentToolMessage(agent_name=agent_name) for item in message.items: if item.content_type == "function_call": + tool_name = item.name or "unknown_tool" + tool_args = item.arguments or {} + logger.info(f"πŸ› οΈ Tool call: {tool_name} with args: {str(tool_args)[:200]}...") + tool_call = AgentToolCall( - tool_name=item.name or "unknown_tool", - arguments=item.arguments or {}, + tool_name=tool_name, + arguments=tool_args, ) final_message.tool_calls.append(tool_call) @@ -65,11 +74,18 @@ def agent_response_callback(message: ChatMessageContent, user_id: str = None) -> message_type=WebsocketMessageType.AGENT_TOOL_MESSAGE, ) ) - logging.info(f"Function call: {final_message}") + logging.info(f"πŸ“€ Tool message sent via WebSocket for user: {user_id}") elif message.items and message.items[0].content_type == "function_result": + # Log function results for debugging + logger.info(f"πŸ“₯ Function result received from agent: {agent_name}") + for item in message.items: + if item.content_type == "function_result": + result_content = str(item.result)[:300] if hasattr(item, 'result') else "No result" + logger.info(f"πŸ” Function result: {result_content}...") # skip returning these results for now - agent will return in a later message pass else: + logger.info(f"πŸ’¬ Text message from agent: {agent_name}") final_message = AgentMessage( agent_name=agent_name, timestamp=time.time() or "", diff --git a/src/backend/v3/config/settings.py b/src/backend/v3/config/settings.py index 5958eb4f3..35947db70 100644 --- a/src/backend/v3/config/settings.py +++ b/src/backend/v3/config/settings.py @@ -61,14 +61,17 @@ def __init__(self): self.url = config.MCP_SERVER_ENDPOINT self.name = config.MCP_SERVER_NAME self.description = config.MCP_SERVER_DESCRIPTION + logger.info(f"πŸ”§ MCP Config initialized - URL: {self.url}, Name: {self.name}") def get_headers(self, token: str): """Get MCP headers with authentication token.""" - return ( + headers = ( {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} if token else {} ) + logger.debug(f"πŸ“‹ MCP Headers created: {headers}") + return headers class OrchestrationConfig: @@ -127,6 +130,7 @@ async def wait_for_approval(self, plan_id: str, timeout: Optional[float] = None) asyncio.TimeoutError: If timeout is exceeded KeyError: If plan_id is not found in approvals """ + logger.info(f"Waiting for approval: {plan_id}") if timeout is None: timeout = self.default_timeout @@ -142,9 +146,11 @@ async def wait_for_approval(self, plan_id: str, timeout: Optional[float] = None) try: await asyncio.wait_for(self._approval_events[plan_id].wait(), timeout=timeout) + logger.info(f"Approval received: {plan_id}") return self.approvals[plan_id] except asyncio.TimeoutError: # Clean up on timeout + logger.warning(f"Approval timeout: {plan_id}") self.cleanup_approval(plan_id) raise except asyncio.CancelledError: diff --git a/src/backend/v3/magentic_agents/common/lifecycle.py b/src/backend/v3/magentic_agents/common/lifecycle.py index a9d91983c..6d491e8fe 100644 --- a/src/backend/v3/magentic_agents/common/lifecycle.py +++ b/src/backend/v3/magentic_agents/common/lifecycle.py @@ -1,5 +1,6 @@ from contextlib import AsyncExitStack from typing import Any +import logging from azure.ai.projects.aio import AIProjectClient from azure.identity.aio import DefaultAzureCredential @@ -8,6 +9,8 @@ from v3.magentic_agents.models.agent_models import MCPConfig from v3.config.agent_registry import agent_registry +logger = logging.getLogger(__name__) + class MCPEnabledBase: """ @@ -74,6 +77,7 @@ async def _after_open(self) -> None: async def _enter_mcp_if_configured(self) -> None: if not self.mcp_cfg: + logger.debug("No MCP configuration provided") return # headers = self._build_mcp_headers() plugin = MCPStreamableHttpPlugin( @@ -85,7 +89,13 @@ async def _enter_mcp_if_configured(self) -> None: # Enter MCP async context via the stack to ensure correct LIFO cleanup if self._stack is None: self._stack = AsyncExitStack() - self.mcp_plugin = await self._stack.enter_async_context(plugin) + + try: + self.mcp_plugin = await self._stack.enter_async_context(plugin) + logger.info(f"βœ… MCP plugin '{self.mcp_cfg.name}' successfully initialized") + except Exception as e: + logger.error(f"❌ Failed to initialize MCP plugin '{self.mcp_cfg.name}': {e}") + raise class AzureAgentBase(MCPEnabledBase): diff --git a/src/backend/v3/magentic_agents/foundry_agent.py b/src/backend/v3/magentic_agents/foundry_agent.py index 85620861d..36712c868 100644 --- a/src/backend/v3/magentic_agents/foundry_agent.py +++ b/src/backend/v3/magentic_agents/foundry_agent.py @@ -171,15 +171,23 @@ async def _after_open(self) -> None: # Add MCP plugins if available plugins = [self.mcp_plugin] if self.mcp_plugin else [] + + if self.mcp_plugin: + self.logger.info(f"πŸ”§ Adding MCP plugin to agent: {self.agent_name}") + self.logger.debug(f"MCP plugin name: {getattr(self.mcp_plugin, 'name', 'Unknown')}") + else: + self.logger.debug(f"No MCP plugin for agent: {self.agent_name}") try: + self.logger.info(f"πŸ€– Creating AzureAI agent: {self.agent_name}") self._agent = AzureAIAgent( client=self.client, definition=definition, plugins=plugins, ) + self.logger.info(f"βœ… AzureAI agent created successfully: {self.agent_name}") except Exception as ex: - self.logger.error("Failed to create AzureAIAgent: %s", ex) + self.logger.error("❌ Failed to create AzureAIAgent '%s': %s", self.agent_name, ex) raise # Register agent with global registry for tracking and cleanup diff --git a/src/backend/v3/magentic_agents/proxy_agent.py b/src/backend/v3/magentic_agents/proxy_agent.py index 02cd90b79..25af62c4b 100644 --- a/src/backend/v3/magentic_agents/proxy_agent.py +++ b/src/backend/v3/magentic_agents/proxy_agent.py @@ -282,7 +282,7 @@ async def _wait_for_user_clarification( Raises: asyncio.TimeoutError: If timeout is exceeded (300 seconds default) """ - # logger.info(f"Waiting for user clarification for request: {request_id}") + logger.info(f"Waiting for clarification: {request_id}") # Initialize clarification as pending using the new event-driven method orchestration_config.set_clarification_pending(request_id) @@ -291,14 +291,14 @@ async def _wait_for_user_clarification( # Wait for clarification with timeout using the new event-driven method answer = await orchestration_config.wait_for_clarification(request_id) - # logger.info(f"Clarification received for request {request_id}: {answer}") + logger.info(f"Clarification received for: {request_id}") return UserClarificationResponse( request_id=request_id, answer=answer, ) except asyncio.TimeoutError: # Enhanced timeout handling - notify user via WebSocket and cleanup - logger.debug(f"Clarification timeout for request {request_id} - notifying user and terminating process") + logger.warning(f"Clarification timeout for request: {request_id}") # Create timeout notification message from v3.models.messages import TimeoutNotification, WebsocketMessageType diff --git a/src/backend/v3/orchestration/human_approval_manager.py b/src/backend/v3/orchestration/human_approval_manager.py index bfba4befe..952dc81b0 100644 --- a/src/backend/v3/orchestration/human_approval_manager.py +++ b/src/backend/v3/orchestration/human_approval_manager.py @@ -53,15 +53,24 @@ def __init__(self, user_id: str, *args, **kwargs): # Remove any custom kwargs before passing to parent plan_append = """ -IMPORTANT: Never ask the user for information or clarification until all agents on the team have been asked first. + +CRITICAL DOMAIN CHECK: Examine team agents first - if request doesn't match team domain, reject immediately: +- CustomerDataAgent/OrderDataAgent = RETAIL team (reject HR/employee requests) +- HRHelperAgent = HR team (reject non-HR requests) +- ProductAgent/MarketingAgent = MARKETING team (reject non-marketing requests) + +- **ProxyAgent** to politely inform the user that this request does not match this team’s domain and should be redirected to the appropriate team. No clarifications or follow-up questions should be asked. + +IMPORTANT: Never ask the user for information or clarification until all agents on the team have been asked first. + EXAMPLE: If the user request involves product information, first ask all agents on the team to provide the information. Do not ask the user unless all agents have been consulted and the information is still missing. - + Plan steps should always include a bullet point, followed by an agent name, followed by a description of the action to be taken. If a step involves multiple actions, separate them into distinct steps with an agent included in each step. If the step is taken by an agent that is not part of the team, such as the MagenticManager, please always list the MagenticManager as the agent for that step. At any time, if more information is needed from the user, use the ProxyAgent to request this information. - + Here is an example of a well-structured plan: - **EnhancedResearchAgent** to gather authoritative data on the latest industry trends and best practices in employee onboarding - **EnhancedResearchAgent** to gather authoritative data on Innovative onboarding techniques that enhance new hire engagement and retention. @@ -69,7 +78,6 @@ def __init__(self, user_id: str, *args, **kwargs): - **DocumentCreationAgent** to draft a comprehensive onboarding plan that includes a checklist of resources and materials needed for effective onboarding. - **ProxyAgent** to review the drafted onboarding plan for clarity and completeness. - **MagenticManager** to finalize the onboarding plan and prepare it for presentation to stakeholders. - """ final_append = """ diff --git a/src/backend/v3/orchestration/orchestration_manager.py b/src/backend/v3/orchestration/orchestration_manager.py index 7db458fee..271a82872 100644 --- a/src/backend/v3/orchestration/orchestration_manager.py +++ b/src/backend/v3/orchestration/orchestration_manager.py @@ -39,6 +39,7 @@ async def init_orchestration( cls, agents: List, user_id: str = None ) -> MagenticOrchestration: """Main function to run the agents.""" + cls.logger.info(f"Initializing orchestration for user: {user_id}") # Custom execution settings that should work with Azure OpenAI execution_settings = OpenAIChatPromptExecutionSettings( @@ -97,6 +98,7 @@ async def get_current_or_new_orchestration( cls, user_id: str, team_config: TeamConfiguration, team_switched: bool ) -> MagenticOrchestration: # add team_switched: bool parameter """get existing orchestration instance.""" + cls.logger.info(f"Getting orchestration for user: {user_id}, team_switched: {team_switched}") current_orchestration = orchestration_config.get_current_orchestration(user_id) if ( current_orchestration is None or team_switched @@ -117,6 +119,7 @@ async def get_current_or_new_orchestration( async def run_orchestration(self, user_id, input_task) -> None: """Run the orchestration with user input loop.""" + self.logger.info(f"Starting orchestration run for user: {user_id}") job_id = str(uuid.uuid4()) @@ -139,6 +142,7 @@ async def run_orchestration(self, user_id, input_task) -> None: runtime = InProcessRuntime() runtime.start() + self.logger.info(f"🎯 Starting task execution: {input_task.description[:100]}...") try: @@ -146,6 +150,7 @@ async def run_orchestration(self, user_id, input_task) -> None: task=input_task.description, runtime=runtime, ) + self.logger.info("πŸ“Š Task invocation completed, retrieving results") try: self.logger.info("\nAgent responses:") From bb9b25728fe79184d59d75eefe86790b256e9223 Mon Sep 17 00:00:00 2001 From: Dhruvkumar-Microsoft Date: Wed, 22 Oct 2025 13:27:48 +0530 Subject: [PATCH 02/15] remove the extra prompt --- src/backend/v3/orchestration/human_approval_manager.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/backend/v3/orchestration/human_approval_manager.py b/src/backend/v3/orchestration/human_approval_manager.py index 952dc81b0..89c2f8479 100644 --- a/src/backend/v3/orchestration/human_approval_manager.py +++ b/src/backend/v3/orchestration/human_approval_manager.py @@ -53,15 +53,7 @@ def __init__(self, user_id: str, *args, **kwargs): # Remove any custom kwargs before passing to parent plan_append = """ - -CRITICAL DOMAIN CHECK: Examine team agents first - if request doesn't match team domain, reject immediately: -- CustomerDataAgent/OrderDataAgent = RETAIL team (reject HR/employee requests) -- HRHelperAgent = HR team (reject non-HR requests) -- ProductAgent/MarketingAgent = MARKETING team (reject non-marketing requests) - -- **ProxyAgent** to politely inform the user that this request does not match this team’s domain and should be redirected to the appropriate team. No clarifications or follow-up questions should be asked. - - + IMPORTANT: Never ask the user for information or clarification until all agents on the team have been asked first. EXAMPLE: If the user request involves product information, first ask all agents on the team to provide the information. From 850f90d9d9b15de35827daa5ad0bec4841aee7fa Mon Sep 17 00:00:00 2001 From: Dhruvkumar-Microsoft Date: Wed, 22 Oct 2025 13:29:46 +0530 Subject: [PATCH 03/15] removed commented code --- src/backend/v3/api/router.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/backend/v3/api/router.py b/src/backend/v3/api/router.py index d216b6e2f..6ff928f3f 100644 --- a/src/backend/v3/api/router.py +++ b/src/backend/v3/api/router.py @@ -396,9 +396,6 @@ async def plan_approval( orchestration_config and human_feedback.m_plan_id in orchestration_config.approvals ): - # orchestration_config.approvals[human_feedback.m_plan_id] = ( - # human_feedback.approved - # ) orchestration_config.set_approval_result( human_feedback.m_plan_id, human_feedback.approved ) @@ -531,9 +528,6 @@ async def user_clarification( orchestration_config and human_feedback.request_id in orchestration_config.clarifications ): - # orchestration_config.clarifications[human_feedback.request_id] = ( - # human_feedback.answer - # ) # Use the new event-driven method to set clarification result orchestration_config.set_clarification_result( human_feedback.request_id, human_feedback.answer From bc5c8579f96a062c616f6d808a7aa937f6a45620 Mon Sep 17 00:00:00 2001 From: Ajit Padhi Date: Mon, 10 Nov 2025 16:48:52 +0530 Subject: [PATCH 04/15] updated post deployment script issue fix --- infra/scripts/Team-Config-And-Data.ps1 | 34 +++++++++++++++++++++----- infra/scripts/team_config_and_data.sh | 25 ++++++++++++++----- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/infra/scripts/Team-Config-And-Data.ps1 b/infra/scripts/Team-Config-And-Data.ps1 index 7c1e188c7..65948cccb 100644 --- a/infra/scripts/Team-Config-And-Data.ps1 +++ b/infra/scripts/Team-Config-And-Data.ps1 @@ -48,6 +48,28 @@ function Get-ValuesFromAzdEnv { return $true } +function Get-DeploymentValue { + param( + [object]$DeploymentOutputs, + [string]$PrimaryKey, + [string]$FallbackKey + ) + + $value = $null + + # Try primary key first + if ($DeploymentOutputs.PSObject.Properties[$PrimaryKey]) { + $value = $DeploymentOutputs.$PrimaryKey.value + } + + # If primary key failed, try fallback key + if (-not $value -and $DeploymentOutputs.PSObject.Properties[$FallbackKey]) { + $value = $DeploymentOutputs.$FallbackKey.value + } + + return $value +} + function Get-ValuesFromAzDeployment { Write-Host "Getting values from Azure deployment outputs..." @@ -67,12 +89,12 @@ function Get-ValuesFromAzDeployment { return $false } - # Extract specific outputs - $script:storageAccount = $deploymentOutputs.azurE_STORAGE_ACCOUNT_NAME.value - $script:blobContainer = $deploymentOutputs.azurE_STORAGE_CONTAINER_NAME.value - $script:aiSearch = $deploymentOutputs.azurE_AI_SEARCH_NAME.value - $script:aiSearchIndex = $deploymentOutputs.azurE_AI_SEARCH_INDEX_NAME.value - $script:backendUrl = $deploymentOutputs.backenD_URL.value + # Extract specific outputs with fallback logic + $script:storageAccount = Get-DeploymentValue -DeploymentOutputs $deploymentOutputs -PrimaryKey "azurE_STORAGE_ACCOUNT_NAME" -FallbackKey "azureStorageAccountName" + $script:blobContainer = Get-DeploymentValue -DeploymentOutputs $deploymentOutputs -PrimaryKey "azurE_STORAGE_CONTAINER_NAME" -FallbackKey "azureStorageContainerName" + $script:aiSearch = Get-DeploymentValue -DeploymentOutputs $deploymentOutputs -PrimaryKey "azurE_AI_SEARCH_NAME" -FallbackKey "azureAiSearchName" + $script:aiSearchIndex = Get-DeploymentValue -DeploymentOutputs $deploymentOutputs -PrimaryKey "azurE_AI_SEARCH_INDEX_NAME" -FallbackKey "azureAiSearchIndexName" + $script:backendUrl = Get-DeploymentValue -DeploymentOutputs $deploymentOutputs -PrimaryKey "backenD_URL" -FallbackKey "backendUrl" # Validate that we extracted all required values if (-not $script:storageAccount -or -not $script:blobContainer -or -not $script:aiSearch -or -not $script:aiSearchIndex -or -not $script:backendUrl) { diff --git a/infra/scripts/team_config_and_data.sh b/infra/scripts/team_config_and_data.sh index b917180f3..d7aaf214a 100644 --- a/infra/scripts/team_config_and_data.sh +++ b/infra/scripts/team_config_and_data.sh @@ -47,6 +47,19 @@ get_values_from_azd_env() { return 0 } +# Helper function to extract value with fallback +extract_value() { + local primary_key="$1" + local fallback_key="$2" + local result + + result=$(echo "$deploymentOutputs" | grep -A 3 "\"$primary_key\"" | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') + if [ -z "$result" ]; then + result=$(echo "$deploymentOutputs" | grep -A 3 "\"$fallback_key\"" | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') + fi + echo "$result" +} + get_values_from_az_deployment() { echo "Getting values from Azure deployment outputs..." @@ -66,12 +79,12 @@ get_values_from_az_deployment() { return 1 fi - # Extract specific outputs - storageAccount=$(echo "$deploymentOutputs" | grep -A 3 '"azurE_STORAGE_ACCOUNT_NAME"' | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') - blobContainer=$(echo "$deploymentOutputs" | grep -A 3 '"azurE_STORAGE_CONTAINER_NAME"' | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') - aiSearch=$(echo "$deploymentOutputs" | grep -A 3 '"azurE_AI_SEARCH_NAME"' | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') - aiSearchIndex=$(echo "$deploymentOutputs" | grep -A 3 '"azurE_AI_SEARCH_INDEX_NAME"' | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') - backendUrl=$(echo "$deploymentOutputs" | grep -A 3 '"backenD_URL"' | grep '"value"' | sed 's/.*"value": *"\([^"]*\)".*/\1/') + # Extract all values using the helper function + storageAccount=$(extract_value "azurE_STORAGE_ACCOUNT_NAME" "azureStorageAccountName") + blobContainer=$(extract_value "azurE_STORAGE_CONTAINER_NAME" "azureStorageContainerName") + aiSearch=$(extract_value "azurE_AI_SEARCH_NAME" "azureAiSearchName") + aiSearchIndex=$(extract_value "azurE_AI_SEARCH_INDEX_NAME" "azureAiSearchIndexName") + backendUrl=$(extract_value "backenD_URL" "backendUrl") # Validate that we extracted all required values if [ -z "$storageAccount" ] || [ -z "$blobContainer" ] || [ -z "$aiSearch" ] || [ -z "$aiSearchIndex" ] || [ -z "$backendUrl" ]; then From eb478c8de072ed2a769a68dc92ab0095596f0ca1 Mon Sep 17 00:00:00 2001 From: Dhruvkumar-Microsoft Date: Thu, 13 Nov 2025 10:33:16 +0530 Subject: [PATCH 05/15] added the supress of opentelemetry Warning --- src/backend/app_kernel.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/app_kernel.py b/src/backend/app_kernel.py index b300d41ba..c1782c28d 100644 --- a/src/backend/app_kernel.py +++ b/src/backend/app_kernel.py @@ -74,6 +74,10 @@ async def lifespan(app: FastAPI): logging.WARNING ) +logging.getLogger("opentelemetry.sdk").setLevel( + logging.ERROR +) + # Initialize the FastAPI app app = FastAPI(lifespan=lifespan) From a0fe2ba242b8f9405fbdf1fdc01cd9214b96e5f5 Mon Sep 17 00:00:00 2001 From: Kanchan-Microsoft Date: Thu, 13 Nov 2025 11:35:06 +0530 Subject: [PATCH 06/15] updated fastmcp version --- src/mcp_server/pyproject.toml | 2 +- src/mcp_server/uv.lock | 236 +++++++++++++++++++++++++++++++--- 2 files changed, 220 insertions(+), 18 deletions(-) diff --git a/src/mcp_server/pyproject.toml b/src/mcp_server/pyproject.toml index 4171f90f0..2492e8670 100644 --- a/src/mcp_server/pyproject.toml +++ b/src/mcp_server/pyproject.toml @@ -15,7 +15,7 @@ dynamic = ["version"] # Core runtime dependencies (kept in sync with requirements.txt) dependencies = [ - "fastmcp==2.11.3", + "fastmcp==2.13.0", "uvicorn[standard]==0.32.1", "python-dotenv==1.1.1", "azure-identity==1.19.0", diff --git a/src/mcp_server/uv.lock b/src/mcp_server/uv.lock index e53e24f52..029b6a3bf 100644 --- a/src/mcp_server/uv.lock +++ b/src/mcp_server/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10" [[package]] @@ -77,6 +77,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/d5/3995ed12f941f4a41a273d9b1709282e825ef87ed8eab3833038fee54d59/azure_identity-1.19.0-py3-none-any.whl", hash = "sha256:e3f6558c181692d7509f09de10cca527c7dce426776454fb97df512a46527e81", size = 187587, upload-time = "2024-10-08T15:41:36.423Z" }, ] +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "beartype" +version = "0.22.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/09/9003e5662691056e0e8b2e6f57c799e71875fac0be0e785d8cb11557cd2a/beartype-0.22.5.tar.gz", hash = "sha256:516a9096cc77103c96153474fa35c3ebcd9d36bd2ec8d0e3a43307ced0fa6341", size = 1586256, upload-time = "2025-11-01T05:49:20.771Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/f6/073d19f7b571c08327fbba3f8e011578da67ab62a11f98911274ff80653f/beartype-0.22.5-py3-none-any.whl", hash = "sha256:d9743dd7cd6d193696eaa1e025f8a70fb09761c154675679ff236e61952dfba0", size = 1321700, upload-time = "2025-11-01T05:49:18.436Z" }, +] + +[[package]] +name = "cachetools" +version = "6.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" }, +] + [[package]] name = "certifi" version = "2025.8.3" @@ -281,7 +308,7 @@ version = "3.22.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "docstring-parser", marker = "python_full_version < '4.0'" }, + { name = "docstring-parser", marker = "python_full_version < '4'" }, { name = "rich" }, { name = "rich-rst" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, @@ -291,6 +318,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/e5/a7b6db64f08cfe065e531ec6b508fa7dac704fab70d05adb5bc0c2c1d1b6/cyclopts-3.22.5-py3-none-any.whl", hash = "sha256:92efb4a094d9812718d7efe0bffa319a19cb661f230dbf24406c18cd8809fb82", size = 84994, upload-time = "2025-07-31T18:18:35.939Z" }, ] +[[package]] +name = "diskcache" +version = "5.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload-time = "2023-08-31T06:12:00.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload-time = "2023-08-31T06:11:58.822Z" }, +] + [[package]] name = "dnspython" version = "2.7.0" @@ -345,7 +381,7 @@ wheels = [ [[package]] name = "fastmcp" -version = "2.11.3" +version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib" }, @@ -355,14 +391,17 @@ dependencies = [ { name = "mcp" }, { name = "openapi-core" }, { name = "openapi-pydantic" }, + { name = "platformdirs" }, + { name = "py-key-value-aio", extra = ["disk", "keyring", "memory"] }, { name = "pydantic", extra = ["email"] }, { name = "pyperclip" }, { name = "python-dotenv" }, { name = "rich" }, + { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/80/13aec687ec21727b0fe6d26c6fe2febb33ae24e24c980929a706db3a8bc2/fastmcp-2.11.3.tar.gz", hash = "sha256:e8e3834a3e0b513712b8e63a6f0d4cbe19093459a1da3f7fbf8ef2810cfd34e3", size = 2692092, upload-time = "2025-08-11T21:38:46.493Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/3b/c30af894db2c3ec439d0e4168ba7ce705474cabdd0a599033ad9a19ad977/fastmcp-2.13.0.tar.gz", hash = "sha256:57f7b7503363e1babc0d1a13af18252b80366a409e1de85f1256cce66a4bee35", size = 7767346, upload-time = "2025-10-25T12:54:10.957Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/05/63f63ad5b6789a730d94b8cb3910679c5da1ed5b4e38c957140ac9edcf0e/fastmcp-2.11.3-py3-none-any.whl", hash = "sha256:28f22126c90fd36e5de9cc68b9c271b6d832dcf322256f23d220b68afb3352cc", size = 260231, upload-time = "2025-08-11T21:38:44.746Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7f/09942135f506953fc61bb81b9e5eaf50a8eea923b83d9135bd959168ef2d/fastmcp-2.13.0-py3-none-any.whl", hash = "sha256:bdff1399d3b7ebb79286edfd43eb660182432514a5ab8e4cbfb45f1d841d2aa0", size = 367134, upload-time = "2025-10-25T12:54:09.284Z" }, ] [[package]] @@ -456,6 +495,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + [[package]] name = "iniconfig" version = "2.1.0" @@ -474,6 +525,51 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, ] +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload-time = "2025-08-18T20:05:09.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload-time = "2025-08-18T20:05:08.69Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + [[package]] name = "jsonschema" version = "4.25.1" @@ -516,6 +612,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, ] +[[package]] +name = "keyring" +version = "25.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750, upload-time = "2024-12-25T15:26:45.782Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085, upload-time = "2024-12-25T15:26:44.377Z" }, +] + [[package]] name = "lazy-object-proxy" version = "1.11.0" @@ -558,14 +672,14 @@ dev = [ [package.metadata] requires-dist = [ { name = "azure-identity", specifier = "==1.19.0" }, - { name = "fastmcp", specifier = "==2.11.3" }, + { name = "fastmcp", specifier = "==2.13.0" }, { name = "httpx", specifier = "==0.28.1" }, { name = "pydantic", specifier = "==2.11.7" }, { name = "pydantic-settings", specifier = "==2.6.1" }, { name = "pytest", marker = "extra == 'dev'", specifier = "==8.3.4" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = "==0.24.0" }, - { name = "python-dotenv", specifier = ">=1.1.0" }, - { name = "python-multipart", specifier = "==0.0.17" }, + { name = "python-dotenv", specifier = "==1.1.1" }, + { name = "python-multipart", specifier = "==0.0.18" }, { name = "uvicorn", extras = ["standard"], specifier = "==0.32.1" }, ] provides-extras = ["dev"] @@ -642,7 +756,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.13.0" +version = "1.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -651,15 +765,16 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, { name = "python-multipart" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" }, { name = "starlette" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/a8/564c094de5d6199f727f5d9f5672dbec3b00dfafd0f67bf52d995eaa5951/mcp-1.13.0.tar.gz", hash = "sha256:70452f56f74662a94eb72ac5feb93997b35995e389b3a3a574e078bed2aa9ab3", size = 434709, upload-time = "2025-08-14T15:03:58.58Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/54/dd2330ef4611c27ae59124820863c34e1d3edb1133c58e6375e2d938c9c5/mcp-1.21.0.tar.gz", hash = "sha256:bab0a38e8f8c48080d787233343f8d301b0e1e95846ae7dead251b2421d99855", size = 452697, upload-time = "2025-11-06T23:19:58.432Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/6b/46b8bcefc2ee9e2d2e8d2bd25f1c2512f5a879fac4619d716b194d6e7ccc/mcp-1.13.0-py3-none-any.whl", hash = "sha256:8b1a002ebe6e17e894ec74d1943cc09aa9d23cb931bf58d49ab2e9fa6bb17e4b", size = 160226, upload-time = "2025-08-14T15:03:56.641Z" }, + { url = "https://files.pythonhosted.org/packages/39/47/850b6edc96c03bd44b00de9a0ca3c1cc71e0ba1cd5822955bc9e4eb3fad3/mcp-1.21.0-py3-none-any.whl", hash = "sha256:598619e53eb0b7a6513db38c426b28a4bdf57496fed04332100d2c56acade98b", size = 173672, upload-time = "2025-11-06T23:19:56.508Z" }, ] [[package]] @@ -794,6 +909,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592, upload-time = "2025-01-10T18:43:11.88Z" }, ] +[[package]] +name = "pathvalidate" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262, upload-time = "2025-06-15T09:07:20.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305, upload-time = "2025-06-15T09:07:19.117Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -803,6 +936,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "py-key-value-aio" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "py-key-value-shared" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/35/65310a4818acec0f87a46e5565e341c5a96fc062a9a03495ad28828ff4d7/py_key_value_aio-0.2.8.tar.gz", hash = "sha256:c0cfbb0bd4e962a3fa1a9fa6db9ba9df812899bd9312fa6368aaea7b26008b36", size = 32853, upload-time = "2025-10-24T13:31:04.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/5a/e56747d87a97ad2aff0f3700d77f186f0704c90c2da03bfed9e113dae284/py_key_value_aio-0.2.8-py3-none-any.whl", hash = "sha256:561565547ce8162128fd2bd0b9d70ce04a5f4586da8500cce79a54dfac78c46a", size = 69200, upload-time = "2025-10-24T13:31:03.81Z" }, +] + +[package.optional-dependencies] +disk = [ + { name = "diskcache" }, + { name = "pathvalidate" }, +] +keyring = [ + { name = "keyring" }, +] +memory = [ + { name = "cachetools" }, +] + +[[package]] +name = "py-key-value-shared" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/79/05a1f9280cfa0709479319cbfd2b1c5beb23d5034624f548c83fb65b0b61/py_key_value_shared-0.2.8.tar.gz", hash = "sha256:703b4d3c61af124f0d528ba85995c3c8d78f8bd3d2b217377bd3278598070cc1", size = 8216, upload-time = "2025-10-24T13:31:03.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/7a/1726ceaa3343874f322dd83c9ec376ad81f533df8422b8b1e1233a59f8ce/py_key_value_shared-0.2.8-py3-none-any.whl", hash = "sha256:aff1bbfd46d065b2d67897d298642e80e5349eae588c6d11b48452b46b8d46ba", size = 14586, upload-time = "2025-10-24T13:31:02.838Z" }, +] + [[package]] name = "pycparser" version = "2.22" @@ -1001,11 +1172,11 @@ wheels = [ [[package]] name = "python-multipart" -version = "0.0.17" +version = "0.0.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/22/edea41c2d4a22e666c0c7db7acdcbf7bc8c1c1f7d3b3ca246ec982fec612/python_multipart-0.0.17.tar.gz", hash = "sha256:41330d831cae6e2f22902704ead2826ea038d0419530eadff3ea80175aec5538", size = 36452, upload-time = "2024-10-31T07:09:15.884Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/86/b6b38677dec2e2e7898fc5b6f7e42c2d011919a92d25339451892f27b89c/python_multipart-0.0.18.tar.gz", hash = "sha256:7a68db60c8bfb82e460637fa4750727b45af1d5e2ed215593f917f64694d34fe", size = 36622, upload-time = "2024-11-28T19:16:02.383Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/fb/275137a799169392f1fa88fff2be92f16eee38e982720a8aaadefc4a36b2/python_multipart-0.0.17-py3-none-any.whl", hash = "sha256:15dc4f487e0a9476cc1201261188ee0940165cffc94429b6fc565c4d3045cb5d", size = 24453, upload-time = "2024-10-31T07:09:13.279Z" }, + { url = "https://files.pythonhosted.org/packages/13/6b/b60f47101ba2cac66b4a83246630e68ae9bbe2e614cbae5f4465f46dee13/python_multipart-0.0.18-py3-none-any.whl", hash = "sha256:efe91480f485f6a361427a541db4796f9e1591afc0fb8e7a4ba06bfbc6708996", size = 24389, upload-time = "2024-11-28T19:16:00.947Z" }, ] [[package]] @@ -1030,6 +1201,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, ] +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -1276,6 +1456,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/7e/8ffc71a8f6833d9c9fb999f5b0ee736b8b159fd66968e05c7afc2dbcd57e/rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466", size = 555083, upload-time = "2025-08-07T08:26:19.301Z" }, ] +[[package]] +name = "secretstorage" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/8a/ed6747b1cc723c81f526d4c12c1b1d43d07190e1e8258dbf934392fc850e/secretstorage-3.4.1.tar.gz", hash = "sha256:a799acf5be9fb93db609ebaa4ab6e8f1f3ed5ae640e0fa732bfea59e9c3b50e8", size = 19871, upload-time = "2025-11-11T11:30:23.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/6d/24ebb101484f1911a6be6695b76ce43219caa110ebbe07d8c3a5f3106cca/secretstorage-3.4.1-py3-none-any.whl", hash = "sha256:c55d57b4da3de568d8c3af89dad244ab24c35ca1da8625fc1b550edf005ebc41", size = 15301, upload-time = "2025-11-11T11:30:22.618Z" }, +] + [[package]] name = "six" version = "1.17.0" @@ -1360,11 +1553,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] @@ -1615,3 +1808,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/32/af/d4502dc713b4ccea7 wheels = [ { url = "https://files.pythonhosted.org/packages/ee/ea/c67e1dee1ba208ed22c06d1d547ae5e293374bfc43e0eb0ef5e262b68561/werkzeug-3.1.1-py3-none-any.whl", hash = "sha256:a71124d1ef06008baafa3d266c02f56e1836a5984afd6dd6c9230669d60d9fb5", size = 224371, upload-time = "2024-11-01T16:40:43.994Z" }, ] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] From 88c309642b372891e61b499b26b232b9322aed58 Mon Sep 17 00:00:00 2001 From: "Niraj Chaudhari (Persistent Systems Inc)" Date: Thu, 13 Nov 2025 13:28:50 +0530 Subject: [PATCH 07/15] Add Deletion icon in team selector --- .../src/components/common/TeamSelector.tsx | 10 +++++----- src/frontend/src/styles/TeamSelector.module.css | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/components/common/TeamSelector.tsx b/src/frontend/src/components/common/TeamSelector.tsx index ebbd04a25..ae04bf8ec 100644 --- a/src/frontend/src/components/common/TeamSelector.tsx +++ b/src/frontend/src/components/common/TeamSelector.tsx @@ -29,7 +29,7 @@ import { } from '@fluentui/react-components'; import { ChevronUpDown16Regular, - MoreHorizontal20Regular, + DeleteRegular, Search20Regular, Dismiss20Regular, CheckmarkCircle20Filled, @@ -475,21 +475,21 @@ const TeamSelector: React.FC = ({ mountNode={document.querySelector('[role="dialog"]') || undefined} >