#
tokens: 49260/50000 23/1784 files (page 26/145)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 26 of 145. Use http://codebase.md/microsoft/semanticworkbench?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .devcontainer
│   ├── .vscode
│   │   └── settings.json
│   ├── devcontainer.json
│   ├── OPTIMIZING_FOR_CODESPACES.md
│   ├── POST_SETUP_README.md
│   └── README.md
├── .dockerignore
├── .gitattributes
├── .github
│   ├── policheck.yml
│   └── workflows
│       ├── assistants-codespace-assistant.yml
│       ├── assistants-document-assistant.yml
│       ├── assistants-explorer-assistant.yml
│       ├── assistants-guided-conversation-assistant.yml
│       ├── assistants-knowledge-transfer-assistant.yml
│       ├── assistants-navigator-assistant.yml
│       ├── assistants-project-assistant.yml
│       ├── assistants-prospector-assistant.yml
│       ├── assistants-skill-assistant.yml
│       ├── libraries.yml
│       ├── mcp-server-giphy.yml
│       ├── mcp-server-memory-filesystem-edit.yml
│       ├── mcp-server-memory-user-bio.yml
│       ├── mcp-server-memory-whiteboard.yml
│       ├── mcp-server-open-deep-research-clone.yml
│       ├── mcp-server-web-research.yml
│       ├── workbench-app.yml
│       └── workbench-service.yml
├── .gitignore
├── .multi-root-tools
│   ├── Makefile
│   └── README.md
├── .vscode
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── ai_context
│   └── generated
│       ├── ASPIRE_ORCHESTRATOR.md
│       ├── ASSISTANT_CODESPACE.md
│       ├── ASSISTANT_DOCUMENT.md
│       ├── ASSISTANT_NAVIGATOR.md
│       ├── ASSISTANT_PROJECT.md
│       ├── ASSISTANT_PROSPECTOR.md
│       ├── ASSISTANTS_OTHER.md
│       ├── ASSISTANTS_OVERVIEW.md
│       ├── CONFIGURATION.md
│       ├── DOTNET_LIBRARIES.md
│       ├── EXAMPLES.md
│       ├── MCP_SERVERS.md
│       ├── PYTHON_LIBRARIES_AI_CLIENTS.md
│       ├── PYTHON_LIBRARIES_CORE.md
│       ├── PYTHON_LIBRARIES_EXTENSIONS.md
│       ├── PYTHON_LIBRARIES_SKILLS.md
│       ├── PYTHON_LIBRARIES_SPECIALIZED.md
│       ├── TOOLS.md
│       ├── WORKBENCH_FRONTEND.md
│       └── WORKBENCH_SERVICE.md
├── aspire-orchestrator
│   ├── .editorconfig
│   ├── Aspire.AppHost
│   │   ├── .gitignore
│   │   ├── appsettings.json
│   │   ├── Aspire.AppHost.csproj
│   │   ├── Program.cs
│   │   └── Properties
│   │       └── launchSettings.json
│   ├── Aspire.Extensions
│   │   ├── Aspire.Extensions.csproj
│   │   ├── Dashboard.cs
│   │   ├── DockerFileExtensions.cs
│   │   ├── PathNormalizer.cs
│   │   ├── UvAppHostingExtensions.cs
│   │   ├── UvAppResource.cs
│   │   ├── VirtualEnvironment.cs
│   │   └── WorkbenchServiceHostingExtensions.cs
│   ├── Aspire.ServiceDefaults
│   │   ├── Aspire.ServiceDefaults.csproj
│   │   └── Extensions.cs
│   ├── README.md
│   ├── run.sh
│   ├── SemanticWorkbench.Aspire.sln
│   └── SemanticWorkbench.Aspire.sln.DotSettings
├── assistants
│   ├── codespace-assistant
│   │   ├── .claude
│   │   │   └── settings.local.json
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── extensions.json
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── assets
│   │   │   │   ├── icon_context_transfer.svg
│   │   │   │   └── icon.svg
│   │   │   ├── chat.py
│   │   │   ├── config.py
│   │   │   ├── helpers.py
│   │   │   ├── response
│   │   │   │   ├── __init__.py
│   │   │   │   ├── completion_handler.py
│   │   │   │   ├── models.py
│   │   │   │   ├── request_builder.py
│   │   │   │   ├── response.py
│   │   │   │   ├── step_handler.py
│   │   │   │   └── utils
│   │   │   │       ├── __init__.py
│   │   │   │       ├── abbreviations.py
│   │   │   │       ├── formatting_utils.py
│   │   │   │       ├── message_utils.py
│   │   │   │       └── openai_utils.py
│   │   │   ├── text_includes
│   │   │   │   ├── card_content_context_transfer.md
│   │   │   │   ├── card_content.md
│   │   │   │   ├── codespace_assistant_info.md
│   │   │   │   ├── context_transfer_assistant_info.md
│   │   │   │   ├── guardrails_prompt.txt
│   │   │   │   ├── guidance_prompt_context_transfer.txt
│   │   │   │   ├── guidance_prompt.txt
│   │   │   │   ├── instruction_prompt_context_transfer.txt
│   │   │   │   └── instruction_prompt.txt
│   │   │   └── whiteboard
│   │   │       ├── __init__.py
│   │   │       ├── _inspector.py
│   │   │       └── _whiteboard.py
│   │   ├── assistant.code-workspace
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── document-assistant
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── assets
│   │   │   │   └── icon.svg
│   │   │   ├── chat.py
│   │   │   ├── config.py
│   │   │   ├── context_management
│   │   │   │   ├── __init__.py
│   │   │   │   └── inspector.py
│   │   │   ├── filesystem
│   │   │   │   ├── __init__.py
│   │   │   │   ├── _convert.py
│   │   │   │   ├── _file_sources.py
│   │   │   │   ├── _filesystem.py
│   │   │   │   ├── _inspector.py
│   │   │   │   ├── _model.py
│   │   │   │   ├── _prompts.py
│   │   │   │   └── _tasks.py
│   │   │   ├── guidance
│   │   │   │   ├── __init__.py
│   │   │   │   ├── dynamic_ui_inspector.py
│   │   │   │   ├── guidance_config.py
│   │   │   │   ├── guidance_prompts.py
│   │   │   │   └── README.md
│   │   │   ├── response
│   │   │   │   ├── __init__.py
│   │   │   │   ├── completion_handler.py
│   │   │   │   ├── models.py
│   │   │   │   ├── prompts.py
│   │   │   │   ├── responder.py
│   │   │   │   └── utils
│   │   │   │       ├── __init__.py
│   │   │   │       ├── formatting_utils.py
│   │   │   │       ├── message_utils.py
│   │   │   │       ├── openai_utils.py
│   │   │   │       ├── tokens_tiktoken.py
│   │   │   │       └── workbench_messages.py
│   │   │   ├── text_includes
│   │   │   │   └── document_assistant_info.md
│   │   │   ├── types.py
│   │   │   └── whiteboard
│   │   │       ├── __init__.py
│   │   │       ├── _inspector.py
│   │   │       └── _whiteboard.py
│   │   ├── assistant.code-workspace
│   │   ├── CLAUDE.md
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_convert.py
│   │   │   └── test_data
│   │   │       ├── blank_image.png
│   │   │       ├── Formatting Test.docx
│   │   │       ├── sample_data.csv
│   │   │       ├── sample_data.xlsx
│   │   │       ├── sample_page.html
│   │   │       ├── sample_presentation.pptx
│   │   │       └── simple_pdf.pdf
│   │   └── uv.lock
│   ├── explorer-assistant
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── chat.py
│   │   │   ├── config.py
│   │   │   ├── helpers.py
│   │   │   ├── response
│   │   │   │   ├── __init__.py
│   │   │   │   ├── model.py
│   │   │   │   ├── response_anthropic.py
│   │   │   │   ├── response_openai.py
│   │   │   │   └── response.py
│   │   │   └── text_includes
│   │   │       └── guardrails_prompt.txt
│   │   ├── assistant.code-workspace
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── guided-conversation-assistant
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── agents
│   │   │   │   ├── guided_conversation
│   │   │   │   │   ├── config.py
│   │   │   │   │   ├── definition.py
│   │   │   │   │   └── definitions
│   │   │   │   │       ├── er_triage.py
│   │   │   │   │       ├── interview.py
│   │   │   │   │       ├── patient_intake.py
│   │   │   │   │       └── poem_feedback.py
│   │   │   │   └── guided_conversation_agent.py
│   │   │   ├── chat.py
│   │   │   ├── config.py
│   │   │   └── text_includes
│   │   │       └── guardrails_prompt.txt
│   │   ├── assistant.code-workspace
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── knowledge-transfer-assistant
│   │   ├── .claude
│   │   │   └── settings.local.json
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── agentic
│   │   │   │   ├── __init__.py
│   │   │   │   ├── analysis.py
│   │   │   │   ├── coordinator_support.py
│   │   │   │   └── team_welcome.py
│   │   │   ├── assets
│   │   │   │   ├── icon-knowledge-transfer.svg
│   │   │   │   └── icon.svg
│   │   │   ├── assistant.py
│   │   │   ├── common.py
│   │   │   ├── config.py
│   │   │   ├── conversation_clients.py
│   │   │   ├── conversation_share_link.py
│   │   │   ├── data.py
│   │   │   ├── domain
│   │   │   │   ├── __init__.py
│   │   │   │   ├── audience_manager.py
│   │   │   │   ├── information_request_manager.py
│   │   │   │   ├── knowledge_brief_manager.py
│   │   │   │   ├── knowledge_digest_manager.py
│   │   │   │   ├── learning_objectives_manager.py
│   │   │   │   └── share_manager.py
│   │   │   ├── files.py
│   │   │   ├── logging.py
│   │   │   ├── notifications.py
│   │   │   ├── respond.py
│   │   │   ├── storage_models.py
│   │   │   ├── storage.py
│   │   │   ├── string_utils.py
│   │   │   ├── text_includes
│   │   │   │   ├── assistant_info.md
│   │   │   │   ├── card_content.md
│   │   │   │   ├── coordinator_instructions.txt
│   │   │   │   ├── coordinator_role.txt
│   │   │   │   ├── knowledge_digest_instructions.txt
│   │   │   │   ├── knowledge_digest_prompt.txt
│   │   │   │   ├── share_information_request_detection.txt
│   │   │   │   ├── team_instructions.txt
│   │   │   │   ├── team_role.txt
│   │   │   │   └── welcome_message_generation.txt
│   │   │   ├── tools
│   │   │   │   ├── __init__.py
│   │   │   │   ├── base.py
│   │   │   │   ├── information_requests.py
│   │   │   │   ├── learning_objectives.py
│   │   │   │   ├── learning_outcomes.py
│   │   │   │   ├── progress_tracking.py
│   │   │   │   └── share_setup.py
│   │   │   ├── ui_tabs
│   │   │   │   ├── __init__.py
│   │   │   │   ├── brief.py
│   │   │   │   ├── common.py
│   │   │   │   ├── debug.py
│   │   │   │   ├── learning.py
│   │   │   │   └── sharing.py
│   │   │   └── utils.py
│   │   ├── CLAUDE.md
│   │   ├── docs
│   │   │   ├── design
│   │   │   │   ├── actions.md
│   │   │   │   └── inference.md
│   │   │   ├── DEV_GUIDE.md
│   │   │   ├── how-kta-works.md
│   │   │   ├── JTBD.md
│   │   │   ├── knowledge-transfer-goals.md
│   │   │   ├── learning_assistance.md
│   │   │   ├── notable_claude_conversations
│   │   │   │   ├── clarifying_quad_modal_design.md
│   │   │   │   ├── CLAUDE_PROMPTS.md
│   │   │   │   ├── transfer_state.md
│   │   │   │   └── trying_the_context_agent.md
│   │   │   └── opportunities-of-knowledge-transfer.md
│   │   ├── knowledge-transfer-assistant.code-workspace
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_artifact_loading.py
│   │   │   ├── test_inspector.py
│   │   │   ├── test_share_manager.py
│   │   │   ├── test_share_storage.py
│   │   │   ├── test_share_tools.py
│   │   │   └── test_team_mode.py
│   │   └── uv.lock
│   ├── Makefile
│   ├── navigator-assistant
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── assets
│   │   │   │   ├── card_content.md
│   │   │   │   └── icon.svg
│   │   │   ├── chat.py
│   │   │   ├── config.py
│   │   │   ├── helpers.py
│   │   │   ├── response
│   │   │   │   ├── __init__.py
│   │   │   │   ├── completion_handler.py
│   │   │   │   ├── completion_requestor.py
│   │   │   │   ├── local_tool
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── add_assistant_to_conversation.py
│   │   │   │   │   ├── list_assistant_services.py
│   │   │   │   │   └── model.py
│   │   │   │   ├── models.py
│   │   │   │   ├── prompt.py
│   │   │   │   ├── request_builder.py
│   │   │   │   ├── response.py
│   │   │   │   ├── step_handler.py
│   │   │   │   └── utils
│   │   │   │       ├── __init__.py
│   │   │   │       ├── formatting_utils.py
│   │   │   │       ├── message_utils.py
│   │   │   │       ├── openai_utils.py
│   │   │   │       └── tools.py
│   │   │   ├── text_includes
│   │   │   │   ├── guardrails_prompt.md
│   │   │   │   ├── guidance_prompt.md
│   │   │   │   ├── instruction_prompt.md
│   │   │   │   ├── navigator_assistant_info.md
│   │   │   │   └── semantic_workbench_features.md
│   │   │   └── whiteboard
│   │   │       ├── __init__.py
│   │   │       ├── _inspector.py
│   │   │       └── _whiteboard.py
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── project-assistant
│   │   ├── .cspell
│   │   │   └── custom-dictionary-workspace.txt
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── agentic
│   │   │   │   ├── __init__.py
│   │   │   │   ├── act.py
│   │   │   │   ├── coordinator_next_action.py
│   │   │   │   ├── create_invitation.py
│   │   │   │   ├── detect_audience_and_takeaways.py
│   │   │   │   ├── detect_coordinator_actions.py
│   │   │   │   ├── detect_information_request_needs.py
│   │   │   │   ├── detect_knowledge_package_gaps.py
│   │   │   │   ├── focus.py
│   │   │   │   ├── respond.py
│   │   │   │   ├── team_welcome.py
│   │   │   │   └── update_digest.py
│   │   │   ├── assets
│   │   │   │   ├── icon-knowledge-transfer.svg
│   │   │   │   └── icon.svg
│   │   │   ├── assistant.py
│   │   │   ├── common.py
│   │   │   ├── config.py
│   │   │   ├── conversation_clients.py
│   │   │   ├── data.py
│   │   │   ├── domain
│   │   │   │   ├── __init__.py
│   │   │   │   ├── audience_manager.py
│   │   │   │   ├── conversation_preferences_manager.py
│   │   │   │   ├── information_request_manager.py
│   │   │   │   ├── knowledge_brief_manager.py
│   │   │   │   ├── knowledge_digest_manager.py
│   │   │   │   ├── learning_objectives_manager.py
│   │   │   │   ├── share_manager.py
│   │   │   │   ├── tasks_manager.py
│   │   │   │   └── transfer_manager.py
│   │   │   ├── errors.py
│   │   │   ├── files.py
│   │   │   ├── logging.py
│   │   │   ├── notifications.py
│   │   │   ├── prompt_utils.py
│   │   │   ├── storage.py
│   │   │   ├── string_utils.py
│   │   │   ├── text_includes
│   │   │   │   ├── actor_instructions.md
│   │   │   │   ├── assistant_info.md
│   │   │   │   ├── card_content.md
│   │   │   │   ├── coordinator_instructions copy.md
│   │   │   │   ├── coordinator_instructions.md
│   │   │   │   ├── create_invitation.md
│   │   │   │   ├── detect_audience.md
│   │   │   │   ├── detect_coordinator_actions.md
│   │   │   │   ├── detect_information_request_needs.md
│   │   │   │   ├── detect_knowledge_package_gaps.md
│   │   │   │   ├── focus.md
│   │   │   │   ├── knowledge_digest_instructions.txt
│   │   │   │   ├── team_instructions.txt
│   │   │   │   ├── to_do.md
│   │   │   │   ├── update_knowledge_brief.md
│   │   │   │   ├── update_knowledge_digest.md
│   │   │   │   └── welcome_message_generation.txt
│   │   │   ├── tools
│   │   │   │   ├── __init__.py
│   │   │   │   ├── base.py
│   │   │   │   ├── conversation_preferences.py
│   │   │   │   ├── information_requests.py
│   │   │   │   ├── learning_objectives.py
│   │   │   │   ├── learning_outcomes.py
│   │   │   │   ├── progress_tracking.py
│   │   │   │   ├── share_setup.py
│   │   │   │   ├── system_reminders.py
│   │   │   │   ├── tasks.py
│   │   │   │   └── todo.py
│   │   │   ├── ui_tabs
│   │   │   │   ├── __init__.py
│   │   │   │   ├── brief.py
│   │   │   │   ├── common.py
│   │   │   │   ├── debug.py
│   │   │   │   ├── learning.py
│   │   │   │   └── sharing.py
│   │   │   └── utils.py
│   │   ├── CLAUDE.md
│   │   ├── docs
│   │   │   ├── design
│   │   │   │   ├── actions.md
│   │   │   │   ├── control_options.md
│   │   │   │   ├── design.md
│   │   │   │   ├── inference.md
│   │   │   │   └── PXL_20250814_190140267.jpg
│   │   │   ├── DEV_GUIDE.md
│   │   │   ├── how-kta-works.md
│   │   │   ├── JTBD.md
│   │   │   ├── knowledge-transfer-goals.md
│   │   │   ├── learning_assistance.md
│   │   │   ├── notable_claude_conversations
│   │   │   │   ├── clarifying_quad_modal_design.md
│   │   │   │   ├── CLAUDE_PROMPTS.md
│   │   │   │   ├── transfer_state.md
│   │   │   │   └── trying_the_context_agent.md
│   │   │   └── opportunities-of-knowledge-transfer.md
│   │   ├── knowledge-transfer-assistant.code-workspace
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_artifact_loading.py
│   │   │   ├── test_inspector.py
│   │   │   ├── test_share_manager.py
│   │   │   ├── test_share_storage.py
│   │   │   └── test_team_mode.py
│   │   └── uv.lock
│   ├── prospector-assistant
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── assistant
│   │   │   ├── __init__.py
│   │   │   ├── agents
│   │   │   │   ├── artifact_agent.py
│   │   │   │   ├── document
│   │   │   │   │   ├── config.py
│   │   │   │   │   ├── gc_draft_content_feedback_config.py
│   │   │   │   │   ├── gc_draft_outline_feedback_config.py
│   │   │   │   │   ├── guided_conversation.py
│   │   │   │   │   └── state.py
│   │   │   │   └── document_agent.py
│   │   │   ├── artifact_creation_extension
│   │   │   │   ├── __init__.py
│   │   │   │   ├── _llm.py
│   │   │   │   ├── config.py
│   │   │   │   ├── document.py
│   │   │   │   ├── extension.py
│   │   │   │   ├── store.py
│   │   │   │   ├── test
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   ├── evaluation.py
│   │   │   │   │   ├── test_completion_with_tools.py
│   │   │   │   │   └── test_extension.py
│   │   │   │   └── tools.py
│   │   │   ├── chat.py
│   │   │   ├── config.py
│   │   │   ├── form_fill_extension
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── extension.py
│   │   │   │   ├── inspector.py
│   │   │   │   ├── state.py
│   │   │   │   └── steps
│   │   │   │       ├── __init__.py
│   │   │   │       ├── _guided_conversation.py
│   │   │   │       ├── _llm.py
│   │   │   │       ├── acquire_form_step.py
│   │   │   │       ├── extract_form_fields_step.py
│   │   │   │       ├── fill_form_step.py
│   │   │   │       └── types.py
│   │   │   ├── helpers.py
│   │   │   ├── legacy.py
│   │   │   └── text_includes
│   │   │       ├── artifact_agent_enabled.md
│   │   │       ├── guardrails_prompt.txt
│   │   │       ├── guided_conversation_agent_enabled.md
│   │   │       └── skills_agent_enabled.md
│   │   ├── assistant.code-workspace
│   │   ├── gc_learnings
│   │   │   ├── gc_learnings.md
│   │   │   └── images
│   │   │       ├── gc_conversation_plan_fcn.png
│   │   │       ├── gc_conversation_plan_template.png
│   │   │       ├── gc_execute_plan_callstack.png
│   │   │       ├── gc_functions.png
│   │   │       ├── gc_generate_plan_callstack.png
│   │   │       ├── gc_get_resource_instructions.png
│   │   │       ├── gc_get_termination_instructions.png
│   │   │       ├── gc_kernel_arguments.png
│   │   │       ├── gc_plan_calls.png
│   │   │       ├── gc_termination_instructions.png
│   │   │       ├── sk_get_chat_message_contents.png
│   │   │       ├── sk_inner_get_chat_message_contents.png
│   │   │       ├── sk_send_request_prep.png
│   │   │       └── sk_send_request.png
│   │   ├── Makefile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   └── skill-assistant
│       ├── .env.example
│       ├── .vscode
│       │   ├── launch.json
│       │   └── settings.json
│       ├── assistant
│       │   ├── __init__.py
│       │   ├── config.py
│       │   ├── logging.py
│       │   ├── skill_assistant.py
│       │   ├── skill_engine_registry.py
│       │   ├── skill_event_mapper.py
│       │   ├── text_includes
│       │   │   └── guardrails_prompt.txt
│       │   └── workbench_helpers.py
│       ├── assistant.code-workspace
│       ├── Makefile
│       ├── pyproject.toml
│       ├── README.md
│       ├── tests
│       │   └── test_setup.py
│       └── uv.lock
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── docs
│   ├── .vscode
│   │   └── settings.json
│   ├── ASSISTANT_CONFIG.md
│   ├── ASSISTANT_DEVELOPMENT_GUIDE.md
│   ├── CUSTOM_APP_REGISTRATION.md
│   ├── HOSTED_ASSISTANT_WITH_LOCAL_MCP_SERVERS.md
│   ├── images
│   │   ├── architecture-animation.gif
│   │   ├── configure_assistant.png
│   │   ├── conversation_canvas_open.png
│   │   ├── conversation_duplicate.png
│   │   ├── conversation_export.png
│   │   ├── conversation_share_dialog.png
│   │   ├── conversation_share_link.png
│   │   ├── dashboard_configured_view.png
│   │   ├── dashboard_view.png
│   │   ├── license_agreement.png
│   │   ├── message_bar.png
│   │   ├── message_inspection.png
│   │   ├── message_link.png
│   │   ├── new_prospector_assistant_dialog.png
│   │   ├── open_conversation_canvas.png
│   │   ├── prospector_example.png
│   │   ├── readme1.png
│   │   ├── readme2.png
│   │   ├── readme3.png
│   │   ├── rewind.png
│   │   ├── signin_page.png
│   │   └── splash_screen.png
│   ├── LOCAL_ASSISTANT_WITH_REMOTE_WORKBENCH.md
│   ├── SETUP_DEV_ENVIRONMENT.md
│   └── WORKBENCH_APP.md
├── examples
│   ├── dotnet
│   │   ├── .editorconfig
│   │   ├── dotnet-01-echo-bot
│   │   │   ├── appsettings.json
│   │   │   ├── dotnet-01-echo-bot.csproj
│   │   │   ├── MyAgent.cs
│   │   │   ├── MyAgentConfig.cs
│   │   │   ├── MyWorkbenchConnector.cs
│   │   │   ├── Program.cs
│   │   │   └── README.md
│   │   ├── dotnet-02-message-types-demo
│   │   │   ├── appsettings.json
│   │   │   ├── ConnectorExtensions.cs
│   │   │   ├── docs
│   │   │   │   ├── abc.png
│   │   │   │   ├── code.png
│   │   │   │   ├── config.png
│   │   │   │   ├── echo.png
│   │   │   │   ├── markdown.png
│   │   │   │   ├── mermaid.png
│   │   │   │   ├── reverse.png
│   │   │   │   └── safety-check.png
│   │   │   ├── dotnet-02-message-types-demo.csproj
│   │   │   ├── MyAgent.cs
│   │   │   ├── MyAgentConfig.cs
│   │   │   ├── MyWorkbenchConnector.cs
│   │   │   ├── Program.cs
│   │   │   └── README.md
│   │   └── dotnet-03-simple-chatbot
│   │       ├── appsettings.json
│   │       ├── ConnectorExtensions.cs
│   │       ├── dotnet-03-simple-chatbot.csproj
│   │       ├── MyAgent.cs
│   │       ├── MyAgentConfig.cs
│   │       ├── MyWorkbenchConnector.cs
│   │       ├── Program.cs
│   │       └── README.md
│   ├── Makefile
│   └── python
│       ├── python-01-echo-bot
│       │   ├── .env.example
│       │   ├── .vscode
│       │   │   ├── launch.json
│       │   │   └── settings.json
│       │   ├── assistant
│       │   │   ├── __init__.py
│       │   │   ├── chat.py
│       │   │   └── config.py
│       │   ├── assistant.code-workspace
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── python-02-simple-chatbot
│       │   ├── .env.example
│       │   ├── .vscode
│       │   │   ├── launch.json
│       │   │   └── settings.json
│       │   ├── assistant
│       │   │   ├── __init__.py
│       │   │   ├── chat.py
│       │   │   ├── config.py
│       │   │   └── text_includes
│       │   │       └── guardrails_prompt.txt
│       │   ├── assistant.code-workspace
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       └── python-03-multimodel-chatbot
│           ├── .env.example
│           ├── .vscode
│           │   ├── launch.json
│           │   └── settings.json
│           ├── assistant
│           │   ├── __init__.py
│           │   ├── chat.py
│           │   ├── config.py
│           │   ├── model_adapters.py
│           │   └── text_includes
│           │       └── guardrails_prompt.txt
│           ├── assistant.code-workspace
│           ├── Makefile
│           ├── pyproject.toml
│           ├── README.md
│           └── uv.lock
├── KNOWN_ISSUES.md
├── libraries
│   ├── dotnet
│   │   ├── .editorconfig
│   │   ├── pack.sh
│   │   ├── README.md
│   │   ├── SemanticWorkbench.sln
│   │   ├── SemanticWorkbench.sln.DotSettings
│   │   └── WorkbenchConnector
│   │       ├── AgentBase.cs
│   │       ├── AgentConfig
│   │       │   ├── AgentConfigBase.cs
│   │       │   ├── AgentConfigPropertyAttribute.cs
│   │       │   └── ConfigUtils.cs
│   │       ├── Constants.cs
│   │       ├── IAgentBase.cs
│   │       ├── icon.png
│   │       ├── Models
│   │       │   ├── Command.cs
│   │       │   ├── Conversation.cs
│   │       │   ├── ConversationEvent.cs
│   │       │   ├── DebugInfo.cs
│   │       │   ├── Insight.cs
│   │       │   ├── Message.cs
│   │       │   ├── MessageMetadata.cs
│   │       │   ├── Participant.cs
│   │       │   ├── Sender.cs
│   │       │   └── ServiceInfo.cs
│   │       ├── Storage
│   │       │   ├── AgentInfo.cs
│   │       │   ├── AgentServiceStorage.cs
│   │       │   └── IAgentServiceStorage.cs
│   │       ├── StringLoggingExtensions.cs
│   │       ├── Webservice.cs
│   │       ├── WorkbenchConfig.cs
│   │       ├── WorkbenchConnector.cs
│   │       └── WorkbenchConnector.csproj
│   ├── Makefile
│   └── python
│       ├── anthropic-client
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── anthropic_client
│       │   │   ├── __init__.py
│       │   │   ├── client.py
│       │   │   ├── config.py
│       │   │   └── messages.py
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── assistant-data-gen
│       │   ├── .vscode
│       │   │   ├── launch.json
│       │   │   └── settings.json
│       │   ├── assistant_data_gen
│       │   │   ├── __init__.py
│       │   │   ├── assistant_api.py
│       │   │   ├── config.py
│       │   │   ├── gce
│       │   │   │   ├── __init__.py
│       │   │   │   ├── gce_agent.py
│       │   │   │   └── prompts.py
│       │   │   └── pydantic_ai_utils.py
│       │   ├── configs
│       │   │   └── document_assistant_example_config.yaml
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── scripts
│       │   │   ├── gce_simulation.py
│       │   │   └── generate_scenario.py
│       │   └── uv.lock
│       ├── assistant-drive
│       │   ├── .gitignore
│       │   ├── .vscode
│       │   │   ├── extensions.json
│       │   │   └── settings.json
│       │   ├── assistant_drive
│       │   │   ├── __init__.py
│       │   │   ├── drive.py
│       │   │   └── tests
│       │   │       └── test_basic.py
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── pytest.ini
│       │   ├── README.md
│       │   ├── usage.ipynb
│       │   └── uv.lock
│       ├── assistant-extensions
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── assistant_extensions
│       │   │   ├── __init__.py
│       │   │   ├── ai_clients
│       │   │   │   └── config.py
│       │   │   ├── artifacts
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _artifacts.py
│       │   │   │   ├── _inspector.py
│       │   │   │   └── _model.py
│       │   │   ├── attachments
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _attachments.py
│       │   │   │   ├── _convert.py
│       │   │   │   ├── _model.py
│       │   │   │   ├── _shared.py
│       │   │   │   └── _summarizer.py
│       │   │   ├── chat_context_toolkit
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _config.py
│       │   │   │   ├── archive
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── _archive.py
│       │   │   │   │   └── _summarizer.py
│       │   │   │   ├── message_history
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── _history.py
│       │   │   │   │   └── _message.py
│       │   │   │   └── virtual_filesystem
│       │   │   │       ├── __init__.py
│       │   │   │       ├── _archive_file_source.py
│       │   │   │       └── _attachments_file_source.py
│       │   │   ├── dashboard_card
│       │   │   │   ├── __init__.py
│       │   │   │   └── _dashboard_card.py
│       │   │   ├── document_editor
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _extension.py
│       │   │   │   ├── _inspector.py
│       │   │   │   └── _model.py
│       │   │   ├── mcp
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _assistant_file_resource_handler.py
│       │   │   │   ├── _client_utils.py
│       │   │   │   ├── _devtunnel.py
│       │   │   │   ├── _model.py
│       │   │   │   ├── _openai_utils.py
│       │   │   │   ├── _sampling_handler.py
│       │   │   │   ├── _tool_utils.py
│       │   │   │   └── _workbench_file_resource_handler.py
│       │   │   ├── navigator
│       │   │   │   ├── __init__.py
│       │   │   │   └── _navigator.py
│       │   │   └── workflows
│       │   │       ├── __init__.py
│       │   │       ├── _model.py
│       │   │       ├── _workflows.py
│       │   │       └── runners
│       │   │           └── _user_proxy.py
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── test
│       │   │   └── attachments
│       │   │       └── test_attachments.py
│       │   └── uv.lock
│       ├── chat-context-toolkit
│       │   ├── .claude
│       │   │   └── settings.local.json
│       │   ├── .env.sample
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── assets
│       │   │   ├── archive_v1.png
│       │   │   ├── history_v1.png
│       │   │   └── vfs_v1.png
│       │   ├── chat_context_toolkit
│       │   │   ├── __init__.py
│       │   │   ├── archive
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _archive_reader.py
│       │   │   │   ├── _archive_task_queue.py
│       │   │   │   ├── _state.py
│       │   │   │   ├── _types.py
│       │   │   │   └── summarization
│       │   │   │       ├── __init__.py
│       │   │   │       └── _summarizer.py
│       │   │   ├── history
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _budget.py
│       │   │   │   ├── _decorators.py
│       │   │   │   ├── _history.py
│       │   │   │   ├── _prioritize.py
│       │   │   │   ├── _types.py
│       │   │   │   └── tool_abbreviations
│       │   │   │       ├── __init__.py
│       │   │   │       └── _tool_abbreviations.py
│       │   │   └── virtual_filesystem
│       │   │       ├── __init__.py
│       │   │       ├── _types.py
│       │   │       ├── _virtual_filesystem.py
│       │   │       ├── README.md
│       │   │       └── tools
│       │   │           ├── __init__.py
│       │   │           ├── _ls_tool.py
│       │   │           ├── _tools.py
│       │   │           └── _view_tool.py
│       │   ├── CLAUDE.md
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── test
│       │   │   ├── archive
│       │   │   │   └── test_archive_reader.py
│       │   │   ├── history
│       │   │   │   ├── test_abbreviate_messages.py
│       │   │   │   ├── test_history.py
│       │   │   │   ├── test_pair_and_order_tool_messages.py
│       │   │   │   ├── test_prioritize.py
│       │   │   │   └── test_truncate_messages.py
│       │   │   └── virtual_filesystem
│       │   │       ├── test_virtual_filesystem.py
│       │   │       └── tools
│       │   │           ├── test_ls_tool.py
│       │   │           ├── test_tools.py
│       │   │           └── test_view_tool.py
│       │   └── uv.lock
│       ├── content-safety
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── content_safety
│       │   │   ├── __init__.py
│       │   │   ├── evaluators
│       │   │   │   ├── __init__.py
│       │   │   │   ├── azure_content_safety
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── config.py
│       │   │   │   │   └── evaluator.py
│       │   │   │   ├── config.py
│       │   │   │   ├── evaluator.py
│       │   │   │   └── openai_moderations
│       │   │   │       ├── __init__.py
│       │   │   │       ├── config.py
│       │   │   │       └── evaluator.py
│       │   │   └── README.md
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── events
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── events
│       │   │   ├── __init__.py
│       │   │   └── events.py
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── guided-conversation
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── guided_conversation
│       │   │   ├── __init__.py
│       │   │   ├── functions
│       │   │   │   ├── __init__.py
│       │   │   │   ├── conversation_plan.py
│       │   │   │   ├── execution.py
│       │   │   │   └── final_update_plan.py
│       │   │   ├── guided_conversation_agent.py
│       │   │   ├── plugins
│       │   │   │   ├── __init__.py
│       │   │   │   ├── agenda.py
│       │   │   │   └── artifact.py
│       │   │   └── utils
│       │   │       ├── __init__.py
│       │   │       ├── base_model_llm.py
│       │   │       ├── conversation_helpers.py
│       │   │       ├── openai_tool_calling.py
│       │   │       ├── plugin_helpers.py
│       │   │       └── resources.py
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── llm-client
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── llm_client
│       │   │   ├── __init__.py
│       │   │   └── model.py
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── Makefile
│       ├── mcp-extensions
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── Makefile
│       │   ├── mcp_extensions
│       │   │   ├── __init__.py
│       │   │   ├── _client_session.py
│       │   │   ├── _model.py
│       │   │   ├── _sampling.py
│       │   │   ├── _server_extensions.py
│       │   │   ├── _tool_utils.py
│       │   │   ├── llm
│       │   │   │   ├── __init__.py
│       │   │   │   ├── chat_completion.py
│       │   │   │   ├── helpers.py
│       │   │   │   ├── llm_types.py
│       │   │   │   ├── mcp_chat_completion.py
│       │   │   │   └── openai_chat_completion.py
│       │   │   └── server
│       │   │       ├── __init__.py
│       │   │       └── storage.py
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── tests
│       │   │   └── test_tool_utils.py
│       │   └── uv.lock
│       ├── mcp-tunnel
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── Makefile
│       │   ├── mcp_tunnel
│       │   │   ├── __init__.py
│       │   │   ├── _devtunnel.py
│       │   │   ├── _dir.py
│       │   │   └── _main.py
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   └── uv.lock
│       ├── openai-client
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── Makefile
│       │   ├── openai_client
│       │   │   ├── __init__.py
│       │   │   ├── chat_driver
│       │   │   │   ├── __init__.py
│       │   │   │   ├── chat_driver.ipynb
│       │   │   │   ├── chat_driver.py
│       │   │   │   ├── message_history_providers
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── in_memory_message_history_provider.py
│       │   │   │   │   ├── local_message_history_provider.py
│       │   │   │   │   ├── message_history_provider.py
│       │   │   │   │   └── tests
│       │   │   │   │       └── formatted_instructions_test.py
│       │   │   │   └── README.md
│       │   │   ├── client.py
│       │   │   ├── completion.py
│       │   │   ├── config.py
│       │   │   ├── errors.py
│       │   │   ├── logging.py
│       │   │   ├── messages.py
│       │   │   ├── tokens.py
│       │   │   └── tools.py
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── tests
│       │   │   ├── test_command_parsing.py
│       │   │   ├── test_formatted_messages.py
│       │   │   ├── test_messages.py
│       │   │   └── test_tokens.py
│       │   └── uv.lock
│       ├── semantic-workbench-api-model
│       │   ├── .vscode
│       │   │   └── settings.json
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── semantic_workbench_api_model
│       │   │   ├── __init__.py
│       │   │   ├── assistant_model.py
│       │   │   ├── assistant_service_client.py
│       │   │   ├── workbench_model.py
│       │   │   └── workbench_service_client.py
│       │   └── uv.lock
│       ├── semantic-workbench-assistant
│       │   ├── .vscode
│       │   │   ├── launch.json
│       │   │   └── settings.json
│       │   ├── Makefile
│       │   ├── pyproject.toml
│       │   ├── README.md
│       │   ├── semantic_workbench_assistant
│       │   │   ├── __init__.py
│       │   │   ├── assistant_app
│       │   │   │   ├── __init__.py
│       │   │   │   ├── assistant.py
│       │   │   │   ├── config.py
│       │   │   │   ├── content_safety.py
│       │   │   │   ├── context.py
│       │   │   │   ├── error.py
│       │   │   │   ├── export_import.py
│       │   │   │   ├── protocol.py
│       │   │   │   └── service.py
│       │   │   ├── assistant_service.py
│       │   │   ├── auth.py
│       │   │   ├── canonical.py
│       │   │   ├── command.py
│       │   │   ├── config.py
│       │   │   ├── logging_config.py
│       │   │   ├── settings.py
│       │   │   ├── start.py
│       │   │   └── storage.py
│       │   ├── tests
│       │   │   ├── conftest.py
│       │   │   ├── test_assistant_app.py
│       │   │   ├── test_canonical.py
│       │   │   ├── test_config.py
│       │   │   └── test_storage.py
│       │   └── uv.lock
│       └── skills
│           ├── .vscode
│           │   └── settings.json
│           ├── Makefile
│           ├── README.md
│           └── skill-library
│               ├── .vscode
│               │   └── settings.json
│               ├── docs
│               │   └── vs-recipe-tool.md
│               ├── Makefile
│               ├── pyproject.toml
│               ├── README.md
│               ├── skill_library
│               │   ├── __init__.py
│               │   ├── chat_driver_helpers.py
│               │   ├── cli
│               │   │   ├── azure_openai.py
│               │   │   ├── conversation_history.py
│               │   │   ├── README.md
│               │   │   ├── run_routine.py
│               │   │   ├── settings.py
│               │   │   └── skill_logger.py
│               │   ├── engine.py
│               │   ├── llm_info.txt
│               │   ├── logging.py
│               │   ├── README.md
│               │   ├── routine_stack.py
│               │   ├── skill.py
│               │   ├── skills
│               │   │   ├── common
│               │   │   │   ├── __init__.py
│               │   │   │   ├── common_skill.py
│               │   │   │   └── routines
│               │   │   │       ├── bing_search.py
│               │   │   │       ├── consolidate.py
│               │   │   │       ├── echo.py
│               │   │   │       ├── gather_context.py
│               │   │   │       ├── get_content_from_url.py
│               │   │   │       ├── gpt_complete.py
│               │   │   │       ├── select_user_intent.py
│               │   │   │       └── summarize.py
│               │   │   ├── eval
│               │   │   │   ├── __init__.py
│               │   │   │   ├── eval_skill.py
│               │   │   │   └── routines
│               │   │   │       └── eval.py
│               │   │   ├── fabric
│               │   │   │   ├── __init__.py
│               │   │   │   ├── fabric_skill.py
│               │   │   │   ├── patterns
│               │   │   │   │   ├── agility_story
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── ai
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_answers
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_candidates
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_cfp_submission
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_claims
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_comments
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_debate
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_email_headers
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_incident
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_interviewer_techniques
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_logs
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_malware
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_military_strategy
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_mistakes
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_paper
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_patent
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_personality
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_presentation
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_product_feedback
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_proposition
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_prose
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_prose_json
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_prose_pinker
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_risk
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_sales_call
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_spiritual_text
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_tech_impact
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_threat_report
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── analyze_threat_report_cmds
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── analyze_threat_report_trends
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── answer_interview_question
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── ask_secure_by_design_questions
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── ask_uncle_duke
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── capture_thinkers_work
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── check_agreement
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── clean_text
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── coding_master
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── compare_and_contrast
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── convert_to_markdown
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_5_sentence_summary
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_academic_paper
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_ai_jobs_analysis
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_aphorisms
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_art_prompt
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_better_frame
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_coding_project
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_command
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_cyber_summary
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_design_document
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_diy
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_formal_email
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_git_diff_commit
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_graph_from_input
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_hormozi_offer
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_idea_compass
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_investigation_visualization
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_keynote
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_logo
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_markmap_visualization
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_mermaid_visualization
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_mermaid_visualization_for_github
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_micro_summary
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_network_threat_landscape
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_newsletter_entry
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_npc
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_pattern
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_prd
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_prediction_block
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_quiz
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_reading_plan
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_recursive_outline
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_report_finding
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_rpg_summary
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_security_update
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_show_intro
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_sigma_rules
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_story_explanation
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_stride_threat_model
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_summary
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_tags
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_threat_scenarios
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_ttrc_graph
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_ttrc_narrative
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_upgrade_pack
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_user_story
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── create_video_chapters
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── create_visualization
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── dialog_with_socrates
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── enrich_blog_post
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── explain_code
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── explain_docs
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── explain_math
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── explain_project
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── explain_terms
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── export_data_as_csv
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_algorithm_update_recommendations
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── extract_article_wisdom
│               │   │   │   │   │   ├── dmiessler
│               │   │   │   │   │   │   └── extract_wisdom-1.0.0
│               │   │   │   │   │   │       ├── system.md
│               │   │   │   │   │   │       └── user.md
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── extract_book_ideas
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_book_recommendations
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_business_ideas
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_controversial_ideas
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_core_message
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_ctf_writeup
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_domains
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_extraordinary_claims
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_ideas
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_insights
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_insights_dm
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_instructions
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_jokes
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_latest_video
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_main_idea
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_most_redeeming_thing
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_patterns
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_poc
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── extract_predictions
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_primary_problem
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_primary_solution
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_product_features
│               │   │   │   │   │   ├── dmiessler
│               │   │   │   │   │   │   └── extract_wisdom-1.0.0
│               │   │   │   │   │   │       ├── system.md
│               │   │   │   │   │   │       └── user.md
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_questions
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_recipe
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_recommendations
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── extract_references
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── extract_skills
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_song_meaning
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_sponsors
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_videoid
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── extract_wisdom
│               │   │   │   │   │   ├── dmiessler
│               │   │   │   │   │   │   └── extract_wisdom-1.0.0
│               │   │   │   │   │   │       ├── system.md
│               │   │   │   │   │   │       └── user.md
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_wisdom_agents
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_wisdom_dm
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── extract_wisdom_nometa
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── find_hidden_message
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── find_logical_fallacies
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── get_wow_per_minute
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── get_youtube_rss
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── humanize
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── identify_dsrp_distinctions
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── identify_dsrp_perspectives
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── identify_dsrp_relationships
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── identify_dsrp_systems
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── identify_job_stories
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── improve_academic_writing
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── improve_prompt
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── improve_report_finding
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── improve_writing
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── judge_output
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── label_and_rate
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── loaded
│               │   │   │   │   ├── md_callout
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── official_pattern_template
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── pattern_explanations.md
│               │   │   │   │   ├── prepare_7s_strategy
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── provide_guidance
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── rate_ai_response
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── rate_ai_result
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── rate_content
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── rate_value
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── raw_query
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── raycast
│               │   │   │   │   │   ├── capture_thinkers_work
│               │   │   │   │   │   ├── create_story_explanation
│               │   │   │   │   │   ├── extract_primary_problem
│               │   │   │   │   │   ├── extract_wisdom
│               │   │   │   │   │   └── yt
│               │   │   │   │   ├── recommend_artists
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── recommend_pipeline_upgrades
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── recommend_talkpanel_topics
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── refine_design_document
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── review_design
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── sanitize_broken_html_to_markdown
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── show_fabric_options_markmap
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── solve_with_cot
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── stringify
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── suggest_pattern
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── summarize
│               │   │   │   │   │   ├── dmiessler
│               │   │   │   │   │   │   └── summarize
│               │   │   │   │   │   │       ├── system.md
│               │   │   │   │   │   │       └── user.md
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── summarize_debate
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_git_changes
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_git_diff
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_lecture
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_legislation
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_meeting
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_micro
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── summarize_newsletter
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── summarize_paper
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── summarize_prompt
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── summarize_pull-requests
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── summarize_rpg_session
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_analyze_challenge_handling
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_check_metrics
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_create_h3_career
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_create_opening_sentences
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_describe_life_outlook
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_extract_intro_sentences
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_extract_panel_topics
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_find_blindspots
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_find_negative_thinking
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_find_neglected_goals
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_give_encouragement
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_red_team_thinking
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_threat_model_plans
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_visualize_mission_goals_projects
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── t_year_in_review
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── to_flashcards
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── transcribe_minutes
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── translate
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── tweet
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── write_essay
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── write_hackerone_report
│               │   │   │   │   │   ├── README.md
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── write_latex
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── write_micro_essay
│               │   │   │   │   │   └── system.md
│               │   │   │   │   ├── write_nuclei_template_rule
│               │   │   │   │   │   ├── system.md
│               │   │   │   │   │   └── user.md
│               │   │   │   │   ├── write_pull-request
│               │   │   │   │   │   └── system.md
│               │   │   │   │   └── write_semgrep_rule
│               │   │   │   │       ├── system.md
│               │   │   │   │       └── user.md
│               │   │   │   └── routines
│               │   │   │       ├── list.py
│               │   │   │       ├── run.py
│               │   │   │       └── show.py
│               │   │   ├── guided_conversation
│               │   │   │   ├── __init__.py
│               │   │   │   ├── agenda.py
│               │   │   │   ├── artifact_helpers.py
│               │   │   │   ├── chat_completions
│               │   │   │   │   ├── fix_agenda_error.py
│               │   │   │   │   ├── fix_artifact_error.py
│               │   │   │   │   ├── generate_agenda.py
│               │   │   │   │   ├── generate_artifact_updates.py
│               │   │   │   │   ├── generate_final_artifact.py
│               │   │   │   │   └── generate_message.py
│               │   │   │   ├── conversation_guides
│               │   │   │   │   ├── __init__.py
│               │   │   │   │   ├── acrostic_poem.py
│               │   │   │   │   ├── er_triage.py
│               │   │   │   │   ├── interview.py
│               │   │   │   │   └── patient_intake.py
│               │   │   │   ├── guide.py
│               │   │   │   ├── guided_conversation_skill.py
│               │   │   │   ├── logging.py
│               │   │   │   ├── message.py
│               │   │   │   ├── resources.py
│               │   │   │   ├── routines
│               │   │   │   │   └── guided_conversation.py
│               │   │   │   └── tests
│               │   │   │       ├── conftest.py
│               │   │   │       ├── test_artifact_helpers.py
│               │   │   │       ├── test_generate_agenda.py
│               │   │   │       ├── test_generate_artifact_updates.py
│               │   │   │       ├── test_generate_final_artifact.py
│               │   │   │       └── test_resource.py
│               │   │   ├── meta
│               │   │   │   ├── __init__.py
│               │   │   │   ├── meta_skill.py
│               │   │   │   ├── README.md
│               │   │   │   └── routines
│               │   │   │       └── generate_routine.py
│               │   │   ├── posix
│               │   │   │   ├── __init__.py
│               │   │   │   ├── posix_skill.py
│               │   │   │   ├── routines
│               │   │   │   │   ├── append_file.py
│               │   │   │   │   ├── cd.py
│               │   │   │   │   ├── ls.py
│               │   │   │   │   ├── make_home_dir.py
│               │   │   │   │   ├── mkdir.py
│               │   │   │   │   ├── mv.py
│               │   │   │   │   ├── pwd.py
│               │   │   │   │   ├── read_file.py
│               │   │   │   │   ├── rm.py
│               │   │   │   │   ├── touch.py
│               │   │   │   │   └── write_file.py
│               │   │   │   └── sandbox_shell.py
│               │   │   ├── README.md
│               │   │   ├── research
│               │   │   │   ├── __init__.py
│               │   │   │   ├── README.md
│               │   │   │   ├── research_skill.py
│               │   │   │   └── routines
│               │   │   │       ├── answer_question_about_content.py
│               │   │   │       ├── evaluate_answer.py
│               │   │   │       ├── generate_research_plan.py
│               │   │   │       ├── generate_search_query.py
│               │   │   │       ├── update_research_plan.py
│               │   │   │       ├── web_research.py
│               │   │   │       └── web_search.py
│               │   │   ├── research2
│               │   │   │   ├── __init__.py
│               │   │   │   ├── README.md
│               │   │   │   ├── research_skill.py
│               │   │   │   └── routines
│               │   │   │       ├── facts.py
│               │   │   │       ├── make_final_report.py
│               │   │   │       ├── research.py
│               │   │   │       ├── search_plan.py
│               │   │   │       ├── search.py
│               │   │   │       └── visit_pages.py
│               │   │   └── web_research
│               │   │       ├── __init__.py
│               │   │       ├── README.md
│               │   │       ├── research_skill.py
│               │   │       └── routines
│               │   │           ├── facts.py
│               │   │           ├── make_final_report.py
│               │   │           ├── research.py
│               │   │           ├── search_plan.py
│               │   │           ├── search.py
│               │   │           └── visit_pages.py
│               │   ├── tests
│               │   │   ├── test_common_skill.py
│               │   │   ├── test_integration.py
│               │   │   ├── test_routine_stack.py
│               │   │   ├── tst_skill
│               │   │   │   ├── __init__.py
│               │   │   │   └── routines
│               │   │   │       ├── __init__.py
│               │   │   │       └── a_routine.py
│               │   │   └── utilities
│               │   │       ├── test_find_template_vars.py
│               │   │       ├── test_make_arg_set.py
│               │   │       ├── test_paramspec.py
│               │   │       ├── test_parse_command_string.py
│               │   │       └── test_to_string.py
│               │   ├── types.py
│               │   ├── usage.py
│               │   └── utilities.py
│               └── uv.lock
├── LICENSE
├── Makefile
├── mcp-servers
│   ├── ai-assist-content
│   │   ├── .vscode
│   │   │   └── settings.json
│   │   ├── mcp-example-brave-search.md
│   │   ├── mcp-fastmcp-typescript-README.md
│   │   ├── mcp-llms-full.txt
│   │   ├── mcp-metadata-tips.md
│   │   ├── mcp-python-sdk-README.md
│   │   ├── mcp-typescript-sdk-README.md
│   │   ├── pydanticai-documentation.md
│   │   ├── pydanticai-example-question-graph.md
│   │   ├── pydanticai-example-weather.md
│   │   ├── pydanticai-tutorial.md
│   │   └── README.md
│   ├── Makefile
│   ├── mcp-server-bing-search
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server_bing_search
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── prompts
│   │   │   │   ├── __init__.py
│   │   │   │   ├── clean_website.py
│   │   │   │   └── filter_links.py
│   │   │   ├── server.py
│   │   │   ├── start.py
│   │   │   ├── tools.py
│   │   │   ├── types.py
│   │   │   ├── utils.py
│   │   │   └── web
│   │   │       ├── __init__.py
│   │   │       ├── get_content.py
│   │   │       ├── llm_processing.py
│   │   │       ├── process_website.py
│   │   │       └── search_bing.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   └── test_tools.py
│   │   └── uv.lock
│   ├── mcp-server-bundle
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server_bundle
│   │   │   ├── __init__.py
│   │   │   └── main.py
│   │   ├── pyinstaller.spec
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── mcp-server-filesystem
│   │   ├── .env.example
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── ci.yml
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server_filesystem
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── server.py
│   │   │   └── start.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   └── test_filesystem.py
│   │   └── uv.lock
│   ├── mcp-server-filesystem-edit
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── data
│   │   │   ├── attachments
│   │   │   │   ├── Daily Game Ideas.txt
│   │   │   │   ├── Frontend Framework Proposal.txt
│   │   │   │   ├── ReDoodle.txt
│   │   │   │   └── Research Template.tex
│   │   │   ├── test_cases.yaml
│   │   │   └── transcripts
│   │   │       ├── transcript_research_simple.md
│   │   │       ├── transcript_Startup_Idea_1_202503031513.md
│   │   │       ├── transcript_Startup_Idea_2_202503031659.md
│   │   │       └── transcript_Web_Frontends_202502281551.md
│   │   ├── Makefile
│   │   ├── mcp_server_filesystem_edit
│   │   │   ├── __init__.py
│   │   │   ├── app_handling
│   │   │   │   ├── __init__.py
│   │   │   │   ├── excel.py
│   │   │   │   ├── miktex.py
│   │   │   │   ├── office_common.py
│   │   │   │   ├── powerpoint.py
│   │   │   │   └── word.py
│   │   │   ├── config.py
│   │   │   ├── evals
│   │   │   │   ├── __init__.py
│   │   │   │   ├── common.py
│   │   │   │   ├── run_comments.py
│   │   │   │   ├── run_edit.py
│   │   │   │   └── run_ppt_edit.py
│   │   │   ├── prompts
│   │   │   │   ├── __init__.py
│   │   │   │   ├── add_comments.py
│   │   │   │   ├── analyze_comments.py
│   │   │   │   ├── latex_edit.py
│   │   │   │   ├── markdown_draft.py
│   │   │   │   ├── markdown_edit.py
│   │   │   │   └── powerpoint_edit.py
│   │   │   ├── server.py
│   │   │   ├── start.py
│   │   │   ├── tools
│   │   │   │   ├── __init__.py
│   │   │   │   ├── add_comments.py
│   │   │   │   ├── edit_adapters
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── common.py
│   │   │   │   │   ├── latex.py
│   │   │   │   │   └── markdown.py
│   │   │   │   ├── edit.py
│   │   │   │   └── helpers.py
│   │   │   └── types.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── app_handling
│   │   │   │   ├── test_excel.py
│   │   │   │   ├── test_miktext.py
│   │   │   │   ├── test_office_common.py
│   │   │   │   ├── test_powerpoint.py
│   │   │   │   └── test_word.py
│   │   │   ├── conftest.py
│   │   │   └── tools
│   │   │       └── edit_adapters
│   │   │           ├── test_latex.py
│   │   │           └── test_markdown.py
│   │   └── uv.lock
│   ├── mcp-server-fusion
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── AddInIcon.svg
│   │   ├── config.py
│   │   ├── FusionMCPServerAddIn.manifest
│   │   ├── FusionMCPServerAddIn.py
│   │   ├── mcp_server_fusion
│   │   │   ├── __init__.py
│   │   │   ├── fusion_mcp_server.py
│   │   │   ├── fusion_utils
│   │   │   │   ├── __init__.py
│   │   │   │   ├── event_utils.py
│   │   │   │   ├── general_utils.py
│   │   │   │   └── tool_utils.py
│   │   │   ├── mcp_tools
│   │   │   │   ├── __init__.py
│   │   │   │   ├── fusion_3d_operation.py
│   │   │   │   ├── fusion_geometry.py
│   │   │   │   ├── fusion_pattern.py
│   │   │   │   └── fusion_sketch.py
│   │   │   └── vendor
│   │   │       └── README.md
│   │   ├── README.md
│   │   └── requirements.txt
│   ├── mcp-server-giphy
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── giphy_search.py
│   │   │   ├── sampling.py
│   │   │   ├── server.py
│   │   │   ├── start.py
│   │   │   └── utils.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── mcp-server-memory-user-bio
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server_memory_user_bio
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── server.py
│   │   │   └── start.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── mcp-server-memory-whiteboard
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server_memory_whiteboard
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── server.py
│   │   │   └── start.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── mcp-server-office
│   │   ├── .env.example
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── build.sh
│   │   ├── data
│   │   │   ├── attachments
│   │   │   │   ├── Daily Game Ideas.txt
│   │   │   │   ├── Frontend Framework Proposal.txt
│   │   │   │   └── ReDoodle.txt
│   │   │   └── word
│   │   │       ├── test_cases.yaml
│   │   │       └── transcripts
│   │   │           ├── transcript_Startup_Idea_1_202503031513.md
│   │   │           ├── transcript_Startup_Idea_2_202503031659.md
│   │   │           └── transcript_Web_Frontends_202502281551.md
│   │   ├── Makefile
│   │   ├── mcp_server
│   │   │   ├── __init__.py
│   │   │   ├── app_interaction
│   │   │   │   ├── __init__.py
│   │   │   │   ├── excel_editor.py
│   │   │   │   ├── powerpoint_editor.py
│   │   │   │   └── word_editor.py
│   │   │   ├── config.py
│   │   │   ├── constants.py
│   │   │   ├── evals
│   │   │   │   ├── __init__.py
│   │   │   │   ├── common.py
│   │   │   │   ├── run_comment_analysis.py
│   │   │   │   ├── run_feedback.py
│   │   │   │   └── run_markdown_edit.py
│   │   │   ├── helpers.py
│   │   │   ├── markdown_edit
│   │   │   │   ├── __init__.py
│   │   │   │   ├── comment_analysis.py
│   │   │   │   ├── feedback_step.py
│   │   │   │   ├── markdown_edit.py
│   │   │   │   └── utils.py
│   │   │   ├── prompts
│   │   │   │   ├── __init__.py
│   │   │   │   ├── comment_analysis.py
│   │   │   │   ├── feedback.py
│   │   │   │   ├── markdown_draft.py
│   │   │   │   └── markdown_edit.py
│   │   │   ├── server.py
│   │   │   ├── start.py
│   │   │   └── types.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   └── test_word_editor.py
│   │   └── uv.lock
│   ├── mcp-server-open-deep-research
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   ├── libs
│   │   │   │   └── open_deep_research
│   │   │   │       ├── cookies.py
│   │   │   │       ├── mdconvert.py
│   │   │   │       ├── run_agents.py
│   │   │   │       ├── text_inspector_tool.py
│   │   │   │       ├── text_web_browser.py
│   │   │   │       └── visual_qa.py
│   │   │   ├── open_deep_research.py
│   │   │   ├── server.py
│   │   │   └── start.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   └── uv.lock
│   ├── mcp-server-open-deep-research-clone
│   │   ├── .env.example
│   │   ├── .gitignore
│   │   ├── .vscode
│   │   │   ├── launch.json
│   │   │   └── settings.json
│   │   ├── Makefile
│   │   ├── mcp_server_open_deep_research_clone
│   │   │   ├── __init__.py
│   │   │   ├── azure_openai.py
│   │   │   ├── config.py
│   │   │   ├── logging.py
│   │   │   ├── sampling.py
│   │   │   ├── server.py
│   │   │   ├── start.py
│   │   │   ├── utils.py
│   │   │   └── web_research.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── test
│   │   │   └── test_open_deep_research_clone.py
│   │   └── uv.lock
│   ├── mcp-server-template
│   │   ├── .taplo.toml
│   │   ├── .vscode
│   │   │   └── settings.json
│   │   ├── copier.yml
│   │   ├── README.md
│   │   └── template
│   │       └── {{ project_slug }}
│   │           ├── .env.example.jinja
│   │           ├── .gitignore
│   │           ├── .vscode
│   │           │   ├── launch.json.jinja
│   │           │   └── settings.json
│   │           ├── {{ module_name }}
│   │           │   ├── __init__.py
│   │           │   ├── config.py.jinja
│   │           │   ├── server.py.jinja
│   │           │   └── start.py.jinja
│   │           ├── Makefile.jinja
│   │           ├── pyproject.toml.jinja
│   │           └── README.md.jinja
│   ├── mcp-server-vscode
│   │   ├── .eslintrc.cjs
│   │   ├── .gitignore
│   │   ├── .npmrc
│   │   ├── .vscode
│   │   │   ├── extensions.json
│   │   │   ├── launch.json
│   │   │   ├── settings.json
│   │   │   └── tasks.json
│   │   ├── .vscode-test.mjs
│   │   ├── .vscodeignore
│   │   ├── ASSISTANT_BOOTSTRAP.md
│   │   ├── eslint.config.mjs
│   │   ├── images
│   │   │   └── icon.png
│   │   ├── LICENSE
│   │   ├── Makefile
│   │   ├── out
│   │   │   ├── extension.d.ts
│   │   │   ├── extension.js
│   │   │   ├── test
│   │   │   │   ├── extension.test.d.ts
│   │   │   │   └── extension.test.js
│   │   │   ├── tools
│   │   │   │   ├── code_checker.d.ts
│   │   │   │   ├── code_checker.js
│   │   │   │   ├── debug_tools.d.ts
│   │   │   │   ├── debug_tools.js
│   │   │   │   ├── focus_editor.d.ts
│   │   │   │   ├── focus_editor.js
│   │   │   │   ├── search_symbol.d.ts
│   │   │   │   └── search_symbol.js
│   │   │   └── utils
│   │   │       ├── port.d.ts
│   │   │       └── port.js
│   │   ├── package.json
│   │   ├── pnpm-lock.yaml
│   │   ├── prettier.config.cjs
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── extension.d.ts
│   │   │   ├── extension.ts
│   │   │   ├── test
│   │   │   │   ├── extension.test.d.ts
│   │   │   │   └── extension.test.ts
│   │   │   ├── tools
│   │   │   │   ├── code_checker.d.ts
│   │   │   │   ├── code_checker.ts
│   │   │   │   ├── debug_tools.d.ts
│   │   │   │   ├── debug_tools.ts
│   │   │   │   ├── focus_editor.d.ts
│   │   │   │   ├── focus_editor.ts
│   │   │   │   ├── search_symbol.d.ts
│   │   │   │   └── search_symbol.ts
│   │   │   └── utils
│   │   │       ├── port.d.ts
│   │   │       └── port.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.tsbuildinfo
│   │   ├── vsc-extension-quickstart.md
│   │   └── webpack.config.js
│   └── mcp-server-web-research
│       ├── .env.example
│       ├── .gitignore
│       ├── .vscode
│       │   ├── launch.json
│       │   └── settings.json
│       ├── Makefile
│       ├── mcp_server_web_research
│       │   ├── __init__.py
│       │   ├── azure_openai.py
│       │   ├── config.py
│       │   ├── logging.py
│       │   ├── sampling.py
│       │   ├── server.py
│       │   ├── start.py
│       │   ├── utils.py
│       │   └── web_research.py
│       ├── pyproject.toml
│       ├── README.md
│       ├── test
│       │   └── test_web_research.py
│       └── uv.lock
├── README.md
├── RESPONSIBLE_AI_FAQ.md
├── ruff.toml
├── SECURITY.md
├── semantic-workbench.code-workspace
├── SUPPORT.md
├── tools
│   ├── build_ai_context_files.py
│   ├── collect_files.py
│   ├── docker
│   │   ├── azure_website_sshd.conf
│   │   ├── docker-entrypoint.sh
│   │   ├── Dockerfile.assistant
│   │   └── Dockerfile.mcp-server
│   ├── makefiles
│   │   ├── docker-assistant.mk
│   │   ├── docker-mcp-server.mk
│   │   ├── docker.mk
│   │   ├── python.mk
│   │   ├── recursive.mk
│   │   └── shell.mk
│   ├── reset-service-data.ps1
│   ├── reset-service-data.sh
│   ├── run-app.ps1
│   ├── run-app.sh
│   ├── run-canonical-agent.ps1
│   ├── run-canonical-agent.sh
│   ├── run-dotnet-examples-with-aspire.sh
│   ├── run-python-example1.sh
│   ├── run-python-example2.ps1
│   ├── run-python-example2.sh
│   ├── run-service.ps1
│   ├── run-service.sh
│   ├── run-workbench-chatbot.ps1
│   └── run-workbench-chatbot.sh
├── workbench-app
│   ├── .dockerignore
│   ├── .env.example
│   ├── .eslintrc.cjs
│   ├── .gitignore
│   ├── .vscode
│   │   ├── launch.json
│   │   └── settings.json
│   ├── docker-entrypoint.sh
│   ├── Dockerfile
│   ├── docs
│   │   ├── APP_DEV_GUIDE.md
│   │   ├── MESSAGE_METADATA.md
│   │   ├── MESSAGE_TYPES.md
│   │   ├── README.md
│   │   └── STATE_INSPECTORS.md
│   ├── index.html
│   ├── Makefile
│   ├── nginx.conf
│   ├── package.json
│   ├── pnpm-lock.yaml
│   ├── prettier.config.cjs
│   ├── public
│   │   └── assets
│   │       ├── background-1-upscaled.jpg
│   │       ├── background-1-upscaled.png
│   │       ├── background-1.jpg
│   │       ├── background-1.png
│   │       ├── background-2.jpg
│   │       ├── background-2.png
│   │       ├── experimental-feature.jpg
│   │       ├── favicon.svg
│   │       ├── workflow-designer-1.jpg
│   │       ├── workflow-designer-outlets.jpg
│   │       ├── workflow-designer-states.jpg
│   │       └── workflow-designer-transitions.jpg
│   ├── README.md
│   ├── run.sh
│   ├── src
│   │   ├── components
│   │   │   ├── App
│   │   │   │   ├── AppFooter.tsx
│   │   │   │   ├── AppHeader.tsx
│   │   │   │   ├── AppMenu.tsx
│   │   │   │   ├── AppView.tsx
│   │   │   │   ├── CodeLabel.tsx
│   │   │   │   ├── CommandButton.tsx
│   │   │   │   ├── ConfirmLeave.tsx
│   │   │   │   ├── ContentExport.tsx
│   │   │   │   ├── ContentImport.tsx
│   │   │   │   ├── CopyButton.tsx
│   │   │   │   ├── DialogControl.tsx
│   │   │   │   ├── DynamicIframe.tsx
│   │   │   │   ├── ErrorListFromAppState.tsx
│   │   │   │   ├── ErrorMessageBar.tsx
│   │   │   │   ├── ExperimentalNotice.tsx
│   │   │   │   ├── FormWidgets
│   │   │   │   │   ├── BaseModelEditorWidget.tsx
│   │   │   │   │   ├── CustomizedArrayFieldTemplate.tsx
│   │   │   │   │   ├── CustomizedFieldTemplate.tsx
│   │   │   │   │   ├── CustomizedObjectFieldTemplate.tsx
│   │   │   │   │   └── InspectableWidget.tsx
│   │   │   │   ├── LabelWithDescription.tsx
│   │   │   │   ├── Loading.tsx
│   │   │   │   ├── MenuItemControl.tsx
│   │   │   │   ├── MiniControl.tsx
│   │   │   │   ├── MyAssistantServiceRegistrations.tsx
│   │   │   │   ├── MyItemsManager.tsx
│   │   │   │   ├── OverflowMenu.tsx
│   │   │   │   ├── PresenceMotionList.tsx
│   │   │   │   ├── ProfileSettings.tsx
│   │   │   │   └── TooltipWrapper.tsx
│   │   │   ├── Assistants
│   │   │   │   ├── ApplyConfigButton.tsx
│   │   │   │   ├── AssistantAdd.tsx
│   │   │   │   ├── AssistantConfigExportButton.tsx
│   │   │   │   ├── AssistantConfigImportButton.tsx
│   │   │   │   ├── AssistantConfiguration.tsx
│   │   │   │   ├── AssistantConfigure.tsx
│   │   │   │   ├── AssistantCreate.tsx
│   │   │   │   ├── AssistantDelete.tsx
│   │   │   │   ├── AssistantDuplicate.tsx
│   │   │   │   ├── AssistantExport.tsx
│   │   │   │   ├── AssistantImport.tsx
│   │   │   │   ├── AssistantRemove.tsx
│   │   │   │   ├── AssistantRename.tsx
│   │   │   │   ├── AssistantServiceInfo.tsx
│   │   │   │   ├── AssistantServiceMetadata.tsx
│   │   │   │   └── MyAssistants.tsx
│   │   │   ├── AssistantServiceRegistrations
│   │   │   │   ├── AssistantServiceRegistrationApiKey.tsx
│   │   │   │   ├── AssistantServiceRegistrationApiKeyReset.tsx
│   │   │   │   ├── AssistantServiceRegistrationCreate.tsx
│   │   │   │   └── AssistantServiceRegistrationRemove.tsx
│   │   │   ├── Conversations
│   │   │   │   ├── Canvas
│   │   │   │   │   ├── AssistantCanvas.tsx
│   │   │   │   │   ├── AssistantCanvasList.tsx
│   │   │   │   │   ├── AssistantInspector.tsx
│   │   │   │   │   ├── AssistantInspectorList.tsx
│   │   │   │   │   └── ConversationCanvas.tsx
│   │   │   │   ├── ChatInputPlugins
│   │   │   │   │   ├── ClearEditorPlugin.tsx
│   │   │   │   │   ├── LexicalMenu.ts
│   │   │   │   │   ├── ParticipantMentionsPlugin.tsx
│   │   │   │   │   ├── TypeaheadMenuPlugin.css
│   │   │   │   │   └── TypeaheadMenuPlugin.tsx
│   │   │   │   ├── ContentRenderers
│   │   │   │   │   ├── CodeContentRenderer.tsx
│   │   │   │   │   ├── ContentListRenderer.tsx
│   │   │   │   │   ├── ContentRenderer.tsx
│   │   │   │   │   ├── DiffRenderer.tsx
│   │   │   │   │   ├── HtmlContentRenderer.tsx
│   │   │   │   │   ├── JsonSchemaContentRenderer.tsx
│   │   │   │   │   ├── MarkdownContentRenderer.tsx
│   │   │   │   │   ├── MarkdownEditorRenderer.tsx
│   │   │   │   │   ├── MermaidContentRenderer.tsx
│   │   │   │   │   ├── MusicABCContentRenderer.css
│   │   │   │   │   └── MusicABCContentRenderer.tsx
│   │   │   │   ├── ContextWindow.tsx
│   │   │   │   ├── ConversationCreate.tsx
│   │   │   │   ├── ConversationDuplicate.tsx
│   │   │   │   ├── ConversationExport.tsx
│   │   │   │   ├── ConversationFileIcon.tsx
│   │   │   │   ├── ConversationRemove.tsx
│   │   │   │   ├── ConversationRename.tsx
│   │   │   │   ├── ConversationShare.tsx
│   │   │   │   ├── ConversationShareCreate.tsx
│   │   │   │   ├── ConversationShareList.tsx
│   │   │   │   ├── ConversationShareView.tsx
│   │   │   │   ├── ConversationsImport.tsx
│   │   │   │   ├── ConversationTranscript.tsx
│   │   │   │   ├── DebugInspector.tsx
│   │   │   │   ├── FileItem.tsx
│   │   │   │   ├── FileList.tsx
│   │   │   │   ├── InputAttachmentList.tsx
│   │   │   │   ├── InputOptionsControl.tsx
│   │   │   │   ├── InteractHistory.tsx
│   │   │   │   ├── InteractInput.tsx
│   │   │   │   ├── Message
│   │   │   │   │   ├── AttachmentSection.tsx
│   │   │   │   │   ├── ContentRenderer.tsx
│   │   │   │   │   ├── ContentSafetyNotice.tsx
│   │   │   │   │   ├── InteractMessage.tsx
│   │   │   │   │   ├── MessageActions.tsx
│   │   │   │   │   ├── MessageBase.tsx
│   │   │   │   │   ├── MessageBody.tsx
│   │   │   │   │   ├── MessageContent.tsx
│   │   │   │   │   ├── MessageFooter.tsx
│   │   │   │   │   ├── MessageHeader.tsx
│   │   │   │   │   ├── NotificationAccordion.tsx
│   │   │   │   │   └── ToolResultMessage.tsx
│   │   │   │   ├── MessageDelete.tsx
│   │   │   │   ├── MessageLink.tsx
│   │   │   │   ├── MyConversations.tsx
│   │   │   │   ├── MyShares.tsx
│   │   │   │   ├── ParticipantAvatar.tsx
│   │   │   │   ├── ParticipantAvatarGroup.tsx
│   │   │   │   ├── ParticipantItem.tsx
│   │   │   │   ├── ParticipantList.tsx
│   │   │   │   ├── ParticipantStatus.tsx
│   │   │   │   ├── RewindConversation.tsx
│   │   │   │   ├── ShareRemove.tsx
│   │   │   │   ├── SpeechButton.tsx
│   │   │   │   └── ToolCalls.tsx
│   │   │   └── FrontDoor
│   │   │       ├── Chat
│   │   │       │   ├── AssistantDrawer.tsx
│   │   │       │   ├── CanvasDrawer.tsx
│   │   │       │   ├── Chat.tsx
│   │   │       │   ├── ChatCanvas.tsx
│   │   │       │   ├── ChatControls.tsx
│   │   │       │   └── ConversationDrawer.tsx
│   │   │       ├── Controls
│   │   │       │   ├── AssistantCard.tsx
│   │   │       │   ├── AssistantSelector.tsx
│   │   │       │   ├── AssistantServiceSelector.tsx
│   │   │       │   ├── ConversationItem.tsx
│   │   │       │   ├── ConversationList.tsx
│   │   │       │   ├── ConversationListOptions.tsx
│   │   │       │   ├── NewConversationButton.tsx
│   │   │       │   ├── NewConversationForm.tsx
│   │   │       │   └── SiteMenuButton.tsx
│   │   │       ├── GlobalContent.tsx
│   │   │       └── MainContent.tsx
│   │   ├── Constants.ts
│   │   ├── global.d.ts
│   │   ├── index.css
│   │   ├── libs
│   │   │   ├── AppStorage.ts
│   │   │   ├── AuthHelper.ts
│   │   │   ├── EventSubscriptionManager.ts
│   │   │   ├── Theme.ts
│   │   │   ├── useAssistantCapabilities.ts
│   │   │   ├── useChatCanvasController.ts
│   │   │   ├── useConversationEvents.ts
│   │   │   ├── useConversationUtility.ts
│   │   │   ├── useCreateConversation.ts
│   │   │   ├── useDebugComponentLifecycle.ts
│   │   │   ├── useDragAndDrop.ts
│   │   │   ├── useEnvironment.ts
│   │   │   ├── useExportUtility.ts
│   │   │   ├── useHistoryUtility.ts
│   │   │   ├── useKeySequence.ts
│   │   │   ├── useMediaQuery.ts
│   │   │   ├── useMicrosoftGraph.ts
│   │   │   ├── useNotify.tsx
│   │   │   ├── useParticipantUtility.tsx
│   │   │   ├── useSiteUtility.ts
│   │   │   ├── useWorkbenchEventSource.ts
│   │   │   ├── useWorkbenchService.ts
│   │   │   └── Utility.ts
│   │   ├── main.tsx
│   │   ├── models
│   │   │   ├── Assistant.ts
│   │   │   ├── AssistantCapability.ts
│   │   │   ├── AssistantServiceInfo.ts
│   │   │   ├── AssistantServiceRegistration.ts
│   │   │   ├── Config.ts
│   │   │   ├── Conversation.ts
│   │   │   ├── ConversationFile.ts
│   │   │   ├── ConversationMessage.ts
│   │   │   ├── ConversationMessageDebug.ts
│   │   │   ├── ConversationParticipant.ts
│   │   │   ├── ConversationShare.ts
│   │   │   ├── ConversationShareRedemption.ts
│   │   │   ├── ConversationState.ts
│   │   │   ├── ConversationStateDescription.ts
│   │   │   ├── ServiceEnvironment.ts
│   │   │   └── User.ts
│   │   ├── redux
│   │   │   ├── app
│   │   │   │   ├── hooks.ts
│   │   │   │   ├── rtkQueryErrorLogger.ts
│   │   │   │   └── store.ts
│   │   │   └── features
│   │   │       ├── app
│   │   │       │   ├── appSlice.ts
│   │   │       │   └── AppState.ts
│   │   │       ├── chatCanvas
│   │   │       │   ├── chatCanvasSlice.ts
│   │   │       │   └── ChatCanvasState.ts
│   │   │       ├── localUser
│   │   │       │   ├── localUserSlice.ts
│   │   │       │   └── LocalUserState.ts
│   │   │       └── settings
│   │   │           ├── settingsSlice.ts
│   │   │           └── SettingsState.ts
│   │   ├── Root.tsx
│   │   ├── routes
│   │   │   ├── AcceptTerms.tsx
│   │   │   ├── AssistantEditor.tsx
│   │   │   ├── AssistantServiceRegistrationEditor.tsx
│   │   │   ├── Dashboard.tsx
│   │   │   ├── ErrorPage.tsx
│   │   │   ├── FrontDoor.tsx
│   │   │   ├── Login.tsx
│   │   │   ├── Settings.tsx
│   │   │   ├── ShareRedeem.tsx
│   │   │   └── Shares.tsx
│   │   ├── services
│   │   │   └── workbench
│   │   │       ├── assistant.ts
│   │   │       ├── assistantService.ts
│   │   │       ├── conversation.ts
│   │   │       ├── file.ts
│   │   │       ├── index.ts
│   │   │       ├── participant.ts
│   │   │       ├── share.ts
│   │   │       ├── state.ts
│   │   │       └── workbench.ts
│   │   └── vite-env.d.ts
│   ├── tools
│   │   └── filtered-ts-prune.cjs
│   ├── tsconfig.json
│   └── vite.config.ts
└── workbench-service
    ├── .env.example
    ├── .vscode
    │   ├── extensions.json
    │   ├── launch.json
    │   └── settings.json
    ├── alembic.ini
    ├── devdb
    │   ├── docker-compose.yaml
    │   └── postgresql-init.sh
    ├── Dockerfile
    ├── Makefile
    ├── migrations
    │   ├── env.py
    │   ├── README
    │   ├── script.py.mako
    │   └── versions
    │       ├── 2024_09_19_000000_69dcda481c14_init.py
    │       ├── 2024_09_19_190029_dffb1d7e219a_file_version_filename.py
    │       ├── 2024_09_20_204130_b29524775484_share.py
    │       ├── 2024_10_30_231536_039bec8edc33_index_message_type.py
    │       ├── 2024_11_04_204029_5149c7fb5a32_conversationmessagedebug.py
    │       ├── 2024_11_05_015124_245baf258e11_double_check_debugs.py
    │       ├── 2024_11_25_191056_a106de176394_drop_workflow.py
    │       ├── 2025_03_19_140136_aaaf792d4d72_set_user_title_set.py
    │       ├── 2025_03_21_153250_3763629295ad_add_assistant_template_id.py
    │       ├── 2025_05_19_163613_b2f86e981885_delete_context_transfer_assistants.py
    │       └── 2025_06_18_174328_503c739152f3_delete_knowlege_transfer_assistants.py
    ├── pyproject.toml
    ├── README.md
    ├── semantic_workbench_service
    │   ├── __init__.py
    │   ├── api.py
    │   ├── assistant_api_key.py
    │   ├── auth.py
    │   ├── azure_speech.py
    │   ├── config.py
    │   ├── controller
    │   │   ├── __init__.py
    │   │   ├── assistant_service_client_pool.py
    │   │   ├── assistant_service_registration.py
    │   │   ├── assistant.py
    │   │   ├── conversation_share.py
    │   │   ├── conversation.py
    │   │   ├── convert.py
    │   │   ├── exceptions.py
    │   │   ├── export_import.py
    │   │   ├── file.py
    │   │   ├── participant.py
    │   │   └── user.py
    │   ├── db.py
    │   ├── event.py
    │   ├── files.py
    │   ├── logging_config.py
    │   ├── middleware.py
    │   ├── query.py
    │   ├── service_user_principals.py
    │   ├── service.py
    │   └── start.py
    ├── tests
    │   ├── __init__.py
    │   ├── conftest.py
    │   ├── docker-compose.yaml
    │   ├── test_assistant_api_key.py
    │   ├── test_files.py
    │   ├── test_integration.py
    │   ├── test_middleware.py
    │   ├── test_migrations.py
    │   ├── test_workbench_service.py
    │   └── types.py
    └── uv.lock
```

# Files

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/rate_ai_response/system.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IDENTITY
 2 | 
 3 | You are an expert at rating the quality of AI responses and determining how good they are compared to ultra-qualified humans performing the same tasks.
 4 | 
 5 | # STEPS
 6 | 
 7 | - Fully and deeply process and understand the instructions that were given to the AI. These instructions will come after the #AI INSTRUCTIONS section below. 
 8 | 
 9 | - Fully and deeply process the response that came back from the AI. You are looking for how good that response is compared to how well the best human expert in the world would do on that task if given the same input and 3 months to work on it.
10 | 
11 | - Give a rating of the AI's output quality using the following framework:
12 | 
13 | - A+: As good as the best human expert in the world
14 | - A: As good as a top 1% human expert
15 | - A-: As good as a top 10% human expert
16 | - B+: As good as an untrained human with a 115 IQ
17 | - B: As good as an average intelligence untrained human 
18 | - B-: As good as an average human in a rush
19 | - C: Worse than a human but pretty good
20 | - D: Nowhere near as good as a human
21 | - F: Not useful at all
22 | 
23 | - Give 5 15-word bullets about why they received that letter grade, comparing and contrasting what you would have expected from the best human in the world vs. what was delivered.
24 | 
25 | - Give a 1-100 score of the AI's output.
26 | 
27 | - Give an explanation of how you arrived at that score using the bullet point explanation and the grade given above.
28 | 
29 | # OUTPUT
30 | 
31 | - In a section called LETTER GRADE, give the letter grade score. E.g.:
32 | 
33 | LETTER GRADE
34 | 
35 | A: As good as a top 1% human expert
36 | 
37 | - In a section called LETTER GRADE REASONS, give your explanation of why you gave that grade in 5 bullets. E.g.:
38 | 
39 | (for a B+ grade)
40 | 
41 | - The points of analysis were good but almost anyone could create them
42 | - A human with a couple of hours could have come up with that output 
43 | - The education and IQ requirement required for a human to make this would have been roughly 10th grade level
44 | - A 10th grader could have done this quality of work in less than 2 hours
45 | - There were several deeper points about the input that was not captured in the output
46 | 
47 | - In a section called OUTPUT SCORE, give the 1-100 score for the output, with 100 being at the quality of the best human expert in the world working on that output full-time for 3 months.
48 | 
49 | # OUTPUT INSTRUCTIONS
50 | 
51 | - Output in valid Markdown only.
52 | 
53 | - DO NOT complain about anything, including copyright; just do it.
54 | 
55 | # INPUT INSTRUCTIONS
56 | 
57 | (the input below will be the instructions to the AI followed by the AI's output)
58 | 
59 | 
```

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/extract_patterns/system.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IDENTITY and PURPOSE
 2 | 
 3 | You take a collection of ideas or data or observations and you look for the most interesting and surprising patterns. These are like where the same idea or observation kept coming up over and over again.
 4 | 
 5 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
 6 | 
 7 | # STEPS
 8 | 
 9 | - Think deeply about all the input and the core concepts contained within.
10 | 
11 | - Extract 20 to 50 of the most surprising, insightful, and/or interesting pattern observed from the input into a section called PATTERNS.
12 | 
13 | - Weight the patterns by how often they were mentioned or showed up in the data, combined with how surprising, insightful, and/or interesting they are. But most importantly how often they showed up in the data.
14 | 
15 | - Each pattern should be captured as a bullet point of no more than 16 words.
16 | 
17 | - In a new section called META, talk through the process of how you assembled each pattern, where you got the pattern from, how many components of the input lead to each pattern, and other interesting data about the patterns.
18 | 
19 | - Give the names or sources of the different people or sources that combined to form a pattern. For example: "The same idea was mentioned by both John and Jane."
20 | 
21 | - Each META point should be captured as a bullet point of no more than 16 words.
22 | 
23 | - Add a section called ANALYSIS that gives a one sentence, 30-word summary of all the patterns and your analysis thereof.
24 | 
25 | - Add a section called BEST 5 that gives the best 5 patterns in a list of 30-word bullets. Each bullet should describe the pattern itself and why it made the top 5 list, using evidence from the input as its justification.
26 | 
27 | - Add a section called ADVICE FOR BUILDERS that gives a set of 15-word bullets of advice for people in a startup space related to the input. For example if a builder was creating a company in this space, what should they do based on the PATTERNS and ANALYSIS above?
28 | 
29 | # OUTPUT INSTRUCTIONS
30 | 
31 | - Only output Markdown.
32 | - Extract at least 20 PATTERNS from the content.
33 | - Limit each idea bullet to a maximum of 16 words.
34 | - Write in the style of someone giving helpful analysis finding patterns
35 | - Do not give warnings or notes; only output the requested sections.
36 | - You use bulleted lists for output, not numbered lists.
37 | - Do not repeat ideas, quotes, facts, or resources.
38 | - Do not start items with the same opening words.
39 | - Ensure you follow ALL these instructions when creating your output.
40 | 
41 | # INPUT
42 | 
43 | INPUT:
44 | 
```

--------------------------------------------------------------------------------
/workbench-app/src/components/App/AppView.tsx:
--------------------------------------------------------------------------------

```typescript
 1 | // Copyright (c) Microsoft. All rights reserved.
 2 | import { makeStyles, mergeClasses, shorthands, tokens } from '@fluentui/react-components';
 3 | import React from 'react';
 4 | import { useNavigate } from 'react-router-dom';
 5 | import { Constants } from '../../Constants';
 6 | import { useAppSelector } from '../../redux/app/hooks';
 7 | import { AppFooter } from './AppFooter';
 8 | import { AppHeader } from './AppHeader';
 9 | 
10 | const useClasses = makeStyles({
11 |     documentBody: {
12 |         // backgroundImage: `url('/assets/background-1.jpg')`,
13 |         backgroundImage: `linear-gradient(to right, #FFFFFF, #E6EEFF)`,
14 |     },
15 |     root: {
16 |         display: 'grid',
17 |         gridTemplateRows: 'auto 1fr auto',
18 |         height: '100vh',
19 |     },
20 |     content: {
21 |         overflowY: 'auto',
22 |         height: '100%',
23 |         display: 'flex',
24 |         flexDirection: 'column',
25 |         maxWidth: `${Constants.app.maxContentWidth}px`,
26 |         boxSizing: 'border-box',
27 |         width: '100%',
28 |         gap: tokens.spacingVerticalM,
29 |         ...shorthands.margin('0', 'auto'),
30 |         ...shorthands.padding(tokens.spacingVerticalM),
31 |     },
32 |     fullSize: {
33 |         ...shorthands.padding(0),
34 |         maxWidth: '100%',
35 |     },
36 | });
37 | 
38 | interface AppViewProps {
39 |     title: string | React.ReactNode;
40 |     actions?: {
41 |         items: React.ReactNode[];
42 |         replaceExisting?: boolean;
43 |         hideProfileSettings?: boolean;
44 |     };
45 |     fullSizeContent?: boolean;
46 |     children?: React.ReactNode;
47 | }
48 | 
49 | export const AppView: React.FC<AppViewProps> = (props) => {
50 |     const { title, actions, fullSizeContent, children } = props;
51 |     const classes = useClasses();
52 |     const completedFirstRun = useAppSelector((state) => state.app.completedFirstRun);
53 |     const navigate = useNavigate();
54 | 
55 |     React.useLayoutEffect(() => {
56 |         document.body.className = classes.documentBody;
57 |         return () => {
58 |             document.body.className = '';
59 |         };
60 |     }, [classes.documentBody]);
61 | 
62 |     React.useEffect(() => {
63 |         if (!completedFirstRun?.app && window.location.pathname !== '/terms') {
64 |             navigate('/terms', { state: { redirectTo: window.location.pathname } });
65 |         }
66 |     }, [completedFirstRun, navigate]);
67 | 
68 |     return (
69 |         <div id="app" className={classes.root}>
70 |             <AppHeader title={title} actions={actions} />
71 |             <div className={fullSizeContent ? mergeClasses(classes.content, classes.fullSize) : classes.content}>
72 |                 {children}
73 |             </div>
74 |             <AppFooter />
75 |         </div>
76 |     );
77 | };
78 | 
```

--------------------------------------------------------------------------------
/workbench-service/semantic_workbench_service/config.py:
--------------------------------------------------------------------------------

```python
 1 | from typing import Annotated
 2 | 
 3 | from pydantic import Field, HttpUrl
 4 | from pydantic_settings import BaseSettings, SettingsConfigDict
 5 | 
 6 | from .files import StorageSettings
 7 | from .logging_config import LoggingSettings
 8 | 
 9 | 
10 | class DBSettings(BaseSettings):
11 |     url: str = "sqlite:///.data/workbench.db"
12 |     echosql: bool = False
13 |     postgresql_ssl_mode: str = "require"
14 |     postgresql_pool_size: int = 10
15 |     alembic_config_path: str = "./alembic.ini"
16 | 
17 | 
18 | class ApiKeySettings(BaseSettings):
19 |     key_vault_url: HttpUrl | None = None
20 | 
21 |     @property
22 |     def is_secured(self) -> bool:
23 |         return self.key_vault_url is not None
24 | 
25 | 
26 | class AuthSettings(BaseSettings):
27 |     allowed_jwt_algorithms: set[str] = {"RS256"}
28 |     allowed_app_id: str = "d0a2fed8-abb0-4831-8a24-09f5a0b54d97"
29 | 
30 | 
31 | class AssistantIdentifiers(BaseSettings):
32 |     assistant_service_id: str
33 |     template_id: str
34 |     name: str
35 | 
36 | 
37 | class WebServiceSettings(BaseSettings):
38 |     protocol: str = "http"
39 |     host: str = "127.0.0.1"
40 |     port: int = 3000
41 | 
42 |     assistant_api_key: ApiKeySettings = ApiKeySettings()
43 | 
44 |     anonymous_paths: list[str] = ["/", "/docs", "/openapi.json"]
45 | 
46 |     assistant_service_online_check_interval_seconds: float = 10.0
47 | 
48 |     azure_openai_endpoint: Annotated[str, Field(validation_alias="azure_openai_endpoint")] = ""
49 |     azure_openai_deployment: Annotated[str, Field(validation_alias="azure_openai_deployment")] = "gpt-4o-mini"
50 |     azure_openai_model: Annotated[str, Field(validation_alias="azure_openai_model")] = "gpt-4o-mini"
51 |     azure_openai_api_version: Annotated[str, Field(validation_alias="azure_openai_api_version")] = "2025-02-01-preview"
52 | 
53 |     default_assistants: list[AssistantIdentifiers] = []
54 | 
55 | 
56 | class AzureSpeechSettings(BaseSettings):
57 |     model_config = SettingsConfigDict(
58 |         env_prefix="azure_speech__", env_nested_delimiter="_", env_file=".env", extra="allow"
59 |     )
60 | 
61 |     resource_id: str = ""
62 |     region: str = ""
63 | 
64 | 
65 | class Settings(BaseSettings):
66 |     model_config = SettingsConfigDict(
67 |         env_prefix="workbench__", env_nested_delimiter="__", env_file=".env", extra="allow"
68 |     )
69 | 
70 |     db: DBSettings = DBSettings()
71 |     storage: StorageSettings = StorageSettings()
72 |     logging: LoggingSettings = LoggingSettings()
73 |     service: WebServiceSettings = WebServiceSettings()
74 |     azure_speech: AzureSpeechSettings = AzureSpeechSettings()
75 |     auth: AuthSettings = AuthSettings()
76 | 
77 | 
78 | if __name__ == "__main__":
79 |     # for verifying environment variables are having the expected effect
80 |     settings = Settings()
81 |     print(settings.model_dump())
82 | 
```

--------------------------------------------------------------------------------
/workbench-app/src/components/Assistants/AssistantServiceMetadata.tsx:
--------------------------------------------------------------------------------

```typescript
 1 | // Copyright (c) Microsoft. All rights reserved.
 2 | 
 3 | import { Label, Text, makeStyles, tokens } from '@fluentui/react-components';
 4 | import React from 'react';
 5 | import { AssistantServiceRegistration } from '../../models/AssistantServiceRegistration';
 6 | import { useGetAssistantServiceRegistrationsQuery } from '../../services/workbench';
 7 | 
 8 | const useClasses = makeStyles({
 9 |     root: {
10 |         display: 'flex',
11 |         flexDirection: 'column',
12 |         gap: tokens.spacingVerticalM,
13 |     },
14 |     data: {
15 |         display: 'flex',
16 |         flexDirection: 'column',
17 |         gap: tokens.spacingVerticalS,
18 |     },
19 | });
20 | 
21 | interface AssistantServiceMetadataProps {
22 |     assistantServiceId: string;
23 | }
24 | 
25 | export const AssistantServiceMetadata: React.FC<AssistantServiceMetadataProps> = (props) => {
26 |     const { assistantServiceId } = props;
27 |     const classes = useClasses();
28 | 
29 |     const {
30 |         data: assistantServices,
31 |         isLoading: isAssistantServicesLoading,
32 |         isError: getAssistantServicesError,
33 |     } = useGetAssistantServiceRegistrationsQuery({});
34 | 
35 |     if (getAssistantServicesError) {
36 |         const errorMessage = JSON.stringify(getAssistantServicesError);
37 |         throw new Error(`Error loading assistant services: ${errorMessage}`);
38 |     }
39 | 
40 |     const [assistantService, setAssistantService] = React.useState<AssistantServiceRegistration | undefined>(undefined);
41 | 
42 |     React.useEffect(() => {
43 |         const service = assistantServices?.find((service) => service.assistantServiceId === assistantServiceId);
44 | 
45 |         if (service) {
46 |             setAssistantService(service);
47 |         }
48 |     }, [assistantServiceId, assistantServices, setAssistantService]);
49 | 
50 |     if (isAssistantServicesLoading) return null;
51 |     if (!assistantService) return null;
52 | 
53 |     return (
54 |         <div className={classes.root}>
55 |             <Text size={400} weight="semibold">
56 |                 Assistant Backend Service
57 |             </Text>
58 |             <div className={classes.data}>
59 |                 <Label weight="semibold">{assistantService.name}</Label>
60 |                 <Label>
61 |                     <em>{assistantService.description}</em>
62 |                 </Label>
63 |                 <Label size="small">Assistant service ID: {assistantService.assistantServiceId}</Label>
64 |                 <Label size="small">Hosted at: {assistantService.assistantServiceUrl}</Label>
65 |                 <Label size="small">
66 |                     Created by: {assistantService.createdByUserName} [{assistantService.createdByUserId}]
67 |                 </Label>
68 |             </div>
69 |         </div>
70 |     );
71 | };
72 | 
```

--------------------------------------------------------------------------------
/workbench-app/src/libs/useMicrosoftGraph.ts:
--------------------------------------------------------------------------------

```typescript
 1 | // Copyright (c) Microsoft. All rights reserved.
 2 | 
 3 | import { InteractionRequiredAuthError } from '@azure/msal-browser';
 4 | import { useMsal } from '@azure/msal-react';
 5 | import { Client, ResponseType } from '@microsoft/microsoft-graph-client';
 6 | import React from 'react';
 7 | import { AuthHelper } from './AuthHelper';
 8 | 
 9 | export const useMicrosoftGraph = () => {
10 |     const msal = useMsal();
11 | 
12 |     const getClientAsync = React.useCallback(async (): Promise<Client> => {
13 |         const account = msal.instance.getActiveAccount();
14 |         if (!account) {
15 |             throw new Error('No active account');
16 |         }
17 | 
18 |         const response = await msal.instance
19 |             .acquireTokenSilent({
20 |                 ...AuthHelper.loginRequest,
21 |                 account,
22 |             })
23 |             .catch(async (error) => {
24 |                 if (error instanceof InteractionRequiredAuthError) {
25 |                     return await AuthHelper.loginAsync(msal.instance);
26 |                 }
27 |                 throw error;
28 |             });
29 | 
30 |         if (!response) {
31 |             throw new Error('error acquiring access token');
32 |         }
33 | 
34 |         return Client.init({
35 |             authProvider: (done) => {
36 |                 done(null, response.accessToken);
37 |             },
38 |         });
39 |     }, [msal]);
40 | 
41 |     const getAsync = React.useCallback(
42 |         async <T>(url: string): Promise<T> => {
43 |             const client = await getClientAsync();
44 |             return (await client.api(url).get()) as T;
45 |         },
46 |         [getClientAsync],
47 |     );
48 | 
49 |     const blobToBase64Async = React.useCallback(async (blob: Blob): Promise<string> => {
50 |         return await new Promise((resolve, reject) => {
51 |             const reader = new FileReader();
52 |             reader.onerror = reject;
53 |             reader.onload = () => {
54 |                 resolve(reader.result as string);
55 |             };
56 |             reader.readAsDataURL(blob);
57 |         });
58 |     }, []);
59 | 
60 |     const getPhotoAsync = React.useCallback(
61 |         async (url: string): Promise<string> => {
62 |             const client = await getClientAsync();
63 |             const response = (await client.api(url).responseType(ResponseType.RAW).get()) as Response;
64 |             const blob = await response.blob();
65 |             return await blobToBase64Async(blob);
66 |         },
67 |         [blobToBase64Async, getClientAsync],
68 |     );
69 | 
70 |     const getMyPhotoAsync = React.useCallback(async (): Promise<string> => {
71 |         return await getPhotoAsync('/me/photo/$value');
72 |     }, [getPhotoAsync]);
73 | 
74 |     return {
75 |         getAsync,
76 |         getMyPhotoAsync,
77 |     };
78 | };
79 | 
```

--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/ConversationExport.tsx:
--------------------------------------------------------------------------------

```typescript
 1 | // Copyright (c) Microsoft. All rights reserved.
 2 | 
 3 | import { ProgressBar } from '@fluentui/react-components';
 4 | import React from 'react';
 5 | import { useExportUtility } from '../../libs/useExportUtility';
 6 | import { useNotify } from '../../libs/useNotify';
 7 | import { Utility } from '../../libs/Utility';
 8 | import { ContentExport } from '../App/ContentExport';
 9 | import { DialogControl } from '../App/DialogControl';
10 | 
11 | interface ConversationExportWithStatusDialogProps {
12 |     conversationId?: string;
13 |     onExport: (id: string) => Promise<void>;
14 | }
15 | 
16 | export const ConversationExportWithStatusDialog: React.FC<ConversationExportWithStatusDialogProps> = (props) => {
17 |     const { conversationId, onExport } = props;
18 |     const { exportConversation } = useExportUtility();
19 |     const { notifyWarning } = useNotify();
20 |     const [submitted, setSubmitted] = React.useState(false);
21 | 
22 |     const handleError = React.useCallback(
23 |         (error: Error) => {
24 |             notifyWarning({
25 |                 id: 'error',
26 |                 title: 'Export conversation failed',
27 |                 message: error.message,
28 |             });
29 |         },
30 |         [notifyWarning],
31 |     );
32 | 
33 |     React.useEffect(() => {
34 |         if (!conversationId) {
35 |             return;
36 |         }
37 | 
38 |         (async () => {
39 |             try {
40 |                 await Utility.withStatus(setSubmitted, async () => {
41 |                     await exportConversation(conversationId);
42 |                     await onExport(conversationId);
43 |                 });
44 |             } catch (error) {
45 |                 handleError(error as Error);
46 |             }
47 |         })();
48 |     }, [conversationId, exportConversation, handleError, notifyWarning, onExport]);
49 | 
50 |     return (
51 |         <DialogControl
52 |             open={submitted}
53 |             title="Exporting Conversation"
54 |             hideDismissButton
55 |             content={
56 |                 <p>
57 |                     <ProgressBar />
58 |                 </p>
59 |             }
60 |         />
61 |     );
62 | };
63 | 
64 | interface ConversationExportProps {
65 |     conversationId: string;
66 |     iconOnly?: boolean;
67 |     asToolbarButton?: boolean;
68 | }
69 | 
70 | export const ConversationExport: React.FC<ConversationExportProps> = (props) => {
71 |     const { conversationId, iconOnly, asToolbarButton } = props;
72 |     const { exportConversationFunction } = useExportUtility();
73 | 
74 |     return (
75 |         <ContentExport
76 |             id={conversationId}
77 |             contentTypeLabel="conversation"
78 |             exportFunction={exportConversationFunction}
79 |             iconOnly={iconOnly}
80 |             asToolbarButton={asToolbarButton}
81 |         />
82 |     );
83 | };
84 | 
```

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/improve_report_finding/system.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IDENTITY and PURPOSE
 2 | 
 3 | You are a extremely experienced 'jack-of-all-trades' cyber security consultant that is diligent, concise but informative and professional. You are highly experienced in web, API, infrastructure (on-premise and cloud), and mobile testing. Additionally, you are an expert in threat modeling and analysis.
 4 | 
 5 | You have been tasked with improving a security finding that has been pulled from a penetration test report, and you must output an improved report finding in markdown format.
 6 | 
 7 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
 8 | 
 9 | # STEPS
10 | 
11 | - Create a Title section that contains the title of the finding.
12 | 
13 | - Create a Description section that details the nature of the finding, including insightful and informative information. Do not solely use bullet point lists for this section.
14 | 
15 | - Create a Risk section that details the risk of the finding. Do not solely use bullet point lists for this section.
16 | 
17 | - Extract the 5 to 15 of the most surprising, insightful, and/or interesting recommendations that can be collected from the report into a section called Recommendations.
18 | 
19 | - Create a References section that lists 1 to 5 references that are suitibly named hyperlinks that provide instant access to knowledgeable and informative articles that talk about the issue, the tech and remediations. Do not hallucinate or act confident if you are unsure.
20 | 
21 | - Create a summary sentence that captures the spirit of the finding and its insights in less than 25 words in a section called One-Sentence-Summary:. Use plain and conversational language when creating this summary. Don't use jargon or marketing language.
22 | 
23 | - Extract 10 to 20 of the most surprising, insightful, and/or interesting quotes from the input into a section called Quotes:. Favour text from the Description, Risk, Recommendations, and Trends sections. Use the exact quote text from the input.
24 | 
25 | # OUTPUT INSTRUCTIONS
26 | 
27 | - Only output Markdown.
28 | - Do not output the markdown code syntax, only the content.
29 | - Do not use bold or italics formatting in the markdown output.
30 | - Extract at least 5 TRENDS from the content.
31 | - Extract at least 10 items for the other output sections.
32 | - Do not give warnings or notes; only output the requested sections.
33 | - You use bulleted lists for output, not numbered lists.
34 | - Do not repeat ideas, quotes, facts, or resources.
35 | - Do not start items with the same opening words.
36 | - Ensure you follow ALL these instructions when creating your output.
37 | 
38 | # INPUT
39 | 
40 | INPUT:
41 | 
```

--------------------------------------------------------------------------------
/workbench-app/src/libs/useDragAndDrop.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import debug from 'debug';
 2 | import React from 'react';
 3 | 
 4 | const useDragAndDrop = (domElement?: HTMLElement | null, log?: debug.Debugger, ignoreFileDrop: boolean = false) => {
 5 |     const [isDraggingOver, setIsDraggingOver] = React.useState(false);
 6 | 
 7 |     React.useEffect(() => {
 8 |         if (!domElement) {
 9 |             // no-op if the dom element is not provided
10 |             // allowed so that the hook can be used with
11 |             // React.useRef()
12 |             return;
13 |         }
14 | 
15 |         log?.('adding event listeners for drag and drop');
16 | 
17 |         const handleDragEnter = (event: DragEvent) => {
18 |             event.preventDefault();
19 |             setIsDraggingOver(true);
20 |         };
21 | 
22 |         const handleDragLeave = (event: DragEvent) => {
23 |             const relatedTarget = event.relatedTarget as HTMLElement;
24 |             const currentTarget = event.currentTarget as HTMLElement;
25 | 
26 |             if (currentTarget.contains(relatedTarget)) {
27 |                 // ignore the event if the drag is still within the target element
28 |                 return;
29 |             }
30 |             setIsDraggingOver(false);
31 |         };
32 | 
33 |         const handleDragOver = (event: DragEvent) => {
34 |             // needed to allow drop event to fire
35 |             event.preventDefault();
36 |         };
37 | 
38 |         const handleDrop = (event: DragEvent) => {
39 |             // ignore file drop events at the document level, but only file types this
40 |             // prevents the undesirable behavior of the browser opening the file in the
41 |             // window if the drop event is not handled or the user misses the drop target
42 |             if (ignoreFileDrop && event.dataTransfer?.files.length) {
43 |                 log?.('ignoring file drop event');
44 |                 event.preventDefault();
45 |             }
46 | 
47 |             setIsDraggingOver(false);
48 |         };
49 | 
50 |         domElement.addEventListener('dragenter', handleDragEnter);
51 |         domElement.addEventListener('dragleave', handleDragLeave);
52 |         domElement.addEventListener('dragover', handleDragOver);
53 |         domElement.addEventListener('drop', handleDrop);
54 | 
55 |         return () => {
56 |             log?.('removing event listeners for drag and drop');
57 |             domElement.removeEventListener('dragenter', handleDragEnter);
58 |             domElement.removeEventListener('dragleave', handleDragLeave);
59 |             domElement.removeEventListener('dragover', handleDragOver);
60 |             domElement.removeEventListener('drop', handleDrop);
61 |         };
62 |     }, [log, domElement, ignoreFileDrop]);
63 | 
64 |     return isDraggingOver;
65 | };
66 | 
67 | export default useDragAndDrop;
68 | 
```

--------------------------------------------------------------------------------
/mcp-servers/mcp-server-filesystem-edit/mcp_server_filesystem_edit/evals/run_edit.py:
--------------------------------------------------------------------------------

```python
 1 | # Copyright (c) Microsoft. All rights reserved.
 2 | 
 3 | import asyncio
 4 | import logging
 5 | import os
 6 | 
 7 | from dotenv import load_dotenv
 8 | from mcp_extensions.llm.openai_chat_completion import openai_client
 9 | from rich.columns import Columns
10 | from rich.console import Console
11 | from rich.markdown import Markdown
12 | from rich.panel import Panel
13 | 
14 | from mcp_server_filesystem_edit.evals.common import load_test_cases
15 | from mcp_server_filesystem_edit.tools.edit import CommonEdit
16 | from mcp_server_filesystem_edit.types import (
17 |     CustomContext,
18 |     EditOutput,
19 |     FileOpRequest,
20 | )
21 | 
22 | logger = logging.getLogger(__name__)
23 | 
24 | load_dotenv(override=True)
25 | 
26 | 
27 | def print_edit_output(
28 |     console: Console,
29 |     output: EditOutput,
30 |     test_index: int,
31 |     custom_context: CustomContext,
32 | ) -> None:
33 |     """
34 |     Print the edit output to console using Rich formatting.
35 |     """
36 |     console.rule(f"Test Case {test_index} Results. Latency: {output.llm_latency:.2f} seconds.", style="cyan")
37 |     console.print(
38 |         Panel(
39 |             custom_context.chat_history[-1].content,  # type: ignore
40 |             title="User Request",
41 |             border_style="blue",
42 |             width=120,
43 |         )
44 |     )
45 |     original_doc = Panel(
46 |         Markdown(custom_context.document),
47 |         title="Original Document",
48 |         border_style="yellow",
49 |         width=90,
50 |     )
51 |     new_doc = Panel(
52 |         Markdown(output.new_content),
53 |         title="Edited Document",
54 |         border_style="green",
55 |         width=90,
56 |     )
57 |     console.print(Columns([original_doc, new_doc]))
58 |     console.print(
59 |         Panel(
60 |             output.change_summary or output.output_message,
61 |             title="Change Summary",
62 |             border_style="blue",
63 |             width=120,
64 |         )
65 |     )
66 |     console.print()
67 | 
68 | 
69 | async def main() -> None:
70 |     console = Console()
71 |     custom_contexts = load_test_cases(test_case_type="writing")
72 |     client = openai_client(
73 |         api_type="azure_openai",
74 |         azure_endpoint=os.getenv("ASSISTANT__AZURE_OPENAI_ENDPOINT"),
75 |         aoai_api_version="2025-01-01-preview",
76 |     )
77 | 
78 |     for i, custom_context in enumerate(custom_contexts):
79 |         edit_request = FileOpRequest(
80 |             context=custom_context,
81 |             file_type=custom_context.file_type,
82 |             request_type="dev",
83 |             chat_completion_client=client,
84 |             file_content=custom_context.document,
85 |         )
86 |         editor = CommonEdit()
87 |         output = await editor.run(edit_request)
88 |         print_edit_output(console, output, i + 1, custom_context)
89 | 
90 | 
91 | if __name__ == "__main__":
92 |     asyncio.run(main())
93 | 
```

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_sales_call/system.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IDENTITY
 2 | 
 3 | You are an advanced AI specializing in rating sales call transcripts across a number of performance dimensions.
 4 | 
 5 | # GOALS
 6 | 
 7 | 1. Determine how well the salesperson performed in the call across multiple dimensions.
 8 | 
 9 | 2. Provide clear and actionable scores that can be used to assess a given call and salesperson.
10 | 
11 | 3. Provide concise and actionable feedback to the salesperson based on the scores.
12 | 
13 | # BELIEFS AND APPROACH
14 | 
15 | - The approach is to understand everything about the business first so that we have proper context to evaluate the sales calls.
16 | 
17 | - It's not possible to have a good sales team, or sales associate, or sales call if the salesperson doesn't understand the business, it's vision, it's goals, it's products, and how those are relevant to the customer they're talking to.
18 | 
19 | # STEPS
20 | 
21 | 1. Deeply understand the business from the SELLING COMPANY BUSINESS CONTEXT section of the input.
22 | 
23 | 2. Analyze the sales call based on the provided transcript.
24 | 
25 | 3. Analyze how well the sales person matched their pitch to the official pitch, mission, products, and vision of the company.
26 | 
27 | 4. Rate the sales call across the following dimensions:
28 | 
29 | SALES FUNDAMENTALS (i.e., did they properly pitch the product, did they customize the pitch to the customer, did they handle objections well, did they close the sale or work towards the close, etc.)
30 | 
31 | PITCH ALIGNMENT (i.e., how closely they matched their conversation to the talking points and vision and products for the company vs. being general or nebulous or amorphous and meandering. 
32 | 
33 | Give a 1-10 score for each dimension where 5 is meh, 7 is decent, 8 is good, 9 is great, and 10 is perfect. 4 and below are varying levels of bad.
34 | 
35 | # OUTPUT
36 | 
37 | - In a section called SALES CALL ANALYSIS OVERVIEW, give a 15-word summary of how good of a sales call this was, and why.
38 | 
39 | - In a section called CORE FAILURES, give a list of ways that the salesperson failed to properly align their pitch to the company's pitch and vision and/or use proper sales techniques to get the sale. E.g.: 
40 | 
41 | - Didn't properly differentiate the product from competitors.
42 | - Didn't have proper knowledge of and empathy for the customer.
43 | - Made the product sound like everything else.
44 | - Didn't push for the sale.
45 | - Etc.
46 | - (list as many as are relevant)
47 | 
48 | - In a section called SALES CALL PERFORMANCE RATINGS, give the 1-10 scores for SALES FUNDAMENTALS and PITCH ALIGNMENT.
49 | 
50 | - In a section called RECOMMENDATIONS, give a set of 10 15-word bullet points describing how this salesperson should improve their approach in the future.
51 | 
```

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/guided_conversation/message.py:
--------------------------------------------------------------------------------

```python
 1 | from enum import StrEnum
 2 | 
 3 | from openai.types.chat import ChatCompletionMessageParam
 4 | from pydantic import BaseModel, Field
 5 | 
 6 | 
 7 | class ConversationMessageType(StrEnum):
 8 |     DEFAULT = "default"
 9 |     ARTIFACT_UPDATE = "artifact-update"
10 |     REASONING = "reasoning"
11 | 
12 | 
13 | class Message(BaseModel):
14 |     param: ChatCompletionMessageParam
15 |     type: ConversationMessageType = Field(default=ConversationMessageType.DEFAULT)
16 |     turn: int | None = None
17 | 
18 | 
19 | class Conversation(BaseModel):
20 |     messages: list[Message] = Field(default_factory=list)
21 |     turn: int = 0
22 | 
23 |     def exclude(self, types: list[ConversationMessageType]) -> "Conversation":
24 |         return Conversation(
25 |             messages=[message for message in self.messages if message.type not in types], turn=self.turn
26 |         )
27 | 
28 |     def __str__(self) -> str:
29 |         message_strs = []
30 |         current_turn = None
31 |         for message in self.messages:
32 |             # Modify the default user to be capitalized for consistency with how
33 |             # assistant is written.
34 |             name = message.param["role"]
35 |             if name == "user":
36 |                 name = "User"
37 | 
38 |             # Append the turn number if it has changed.
39 |             if message.turn is not None and current_turn != message.turn:
40 |                 current_turn = message.turn
41 |                 message_strs.append(f"[Turn {current_turn}]")
42 | 
43 |             # Append the message content.
44 |             content = message.param.get("content", "")
45 |             if message.param["role"] == "assistant":
46 |                 if message.type == ConversationMessageType.ARTIFACT_UPDATE:
47 |                     message_strs.append(content)
48 |                 else:
49 |                     message_strs.append(f"Assistant: {content}")
50 |             else:
51 |                 user_string = str(content).strip()
52 |                 if user_string == "":
53 |                     message_strs.append(f"{name}: <sent an empty message>")
54 |                 else:
55 |                     message_strs.append(f"{name}: {user_string}")
56 | 
57 |         return "\n".join(message_strs)
58 | 
59 |     def add_user_message(self, content: str) -> "Conversation":
60 |         self.messages.append(Message(param={"role": "user", "content": content}, turn=self.turn))
61 |         return self
62 | 
63 |     def add_assistant_message(self, content: str) -> "Conversation":
64 |         self.turn += 1
65 |         self.messages.append(
66 |             Message(
67 |                 param={
68 |                     "role": "assistant",
69 |                     "content": content,
70 |                 },
71 |                 turn=self.turn,
72 |             )
73 |         )
74 |         return self
75 | 
```

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_pattern/system.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IDENTITY and PURPOSE
 2 | 
 3 | You are an AI assistant whose primary responsibility is to interpret LLM/AI prompts and deliver responses based on pre-defined structures. You are a master of organization, meticulously analyzing each prompt to identify the specific instructions and any provided examples. You then utilize this knowledge to generate an output that precisely matches the requested structure. You are adept at understanding and following formatting instructions, ensuring that your responses are always accurate and perfectly aligned with the intended outcome.
 4 | 
 5 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
 6 | 
 7 | # STEPS
 8 | 
 9 | - Extract a summary of the role the AI will be taking to fulfil this pattern into a section called IDENTITY and PURPOSE.
10 | 
11 | - Extract a step by step set of instructions the AI will need to follow in order to complete this pattern into a section called STEPS.
12 | 
13 | - Analyze the prompt to determine what format the output should be in.
14 | 
15 | - Extract any specific instructions for how the output should be formatted into a section called OUTPUT INSTRUCTIONS.
16 | 
17 | - Extract any examples from the prompt into a subsection of OUTPUT INSTRUCTIONS called EXAMPLE.
18 | 
19 | # OUTPUT INSTRUCTIONS
20 | 
21 | - Only output Markdown.
22 | 
23 | - All sections should be Heading level 1
24 | 
25 | - Subsections should be one Heading level higher than it's parent section
26 | 
27 | - All bullets should have their own paragraph
28 | 
29 | - Write the IDENTITY and PURPOSE section including the summary of the role using personal pronouns such as 'You'. Be sure to be extremely detailed in explaining the role. Finalize this section with a new paragraph advising the AI to 'Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.'.
30 | 
31 | - Write the STEPS bullets from the prompt
32 | 
33 | - Write the OUTPUT INSTRUCTIONS bullets starting with the first bullet explaining the only output format. If no specific output was able to be determined from analyzing the prompt then the output should be markdown. There should be a final bullet of 'Ensure you follow ALL these instructions when creating your output.'. Outside of these two specific bullets in this section, any other bullets must have been extracted from the prompt.
34 | 
35 | - If an example was provided write the EXAMPLE subsection under the parent section of OUTPUT INSTRUCTIONS.
36 | 
37 | - Write a final INPUT section with just the value 'INPUT:' inside it.
38 | 
39 | - Ensure you follow ALL these instructions when creating your output.
40 | 
41 | # INPUT
42 | 
43 | INPUT:
```

--------------------------------------------------------------------------------
/libraries/python/openai-client/openai_client/chat_driver/message_history_providers/local_message_history_provider.py:
--------------------------------------------------------------------------------

```python
 1 | import json
 2 | from dataclasses import dataclass, field
 3 | from os import PathLike
 4 | from pathlib import Path
 5 | from typing import Any
 6 | 
 7 | from openai.types.chat import (
 8 |     ChatCompletionMessageParam,
 9 | )
10 | from openai_client.messages import MessageFormatter, format_with_liquid
11 | 
12 | from .message_history_provider import MessageHistoryProviderProtocol
13 | 
14 | DEFAULT_DATA_DIR = Path(".data")
15 | 
16 | 
17 | @dataclass
18 | class LocalMessageHistoryProviderConfig:
19 |     session_id: str
20 |     data_dir: PathLike | str | None = None
21 |     messages: list[ChatCompletionMessageParam] = field(default_factory=list)
22 |     formatter: MessageFormatter | None = None
23 | 
24 | 
25 | class LocalMessageHistoryProvider(MessageHistoryProviderProtocol):
26 |     def __init__(self, config: LocalMessageHistoryProviderConfig) -> None:
27 |         if not config.data_dir:
28 |             self.data_dir = DEFAULT_DATA_DIR / "chat_driver" / config.session_id
29 |         else:
30 |             self.data_dir = Path(config.data_dir)
31 |         self.formatter = config.formatter or format_with_liquid
32 | 
33 |         # Create the messages file if it doesn't exist.
34 |         if not self.data_dir.exists():
35 |             self.data_dir.mkdir(parents=True)
36 |         self.messages_file = self.data_dir / "messages.json"
37 |         if not self.messages_file.exists():
38 |             self.messages_file.write_text("[]")
39 | 
40 |     async def get(self) -> list[ChatCompletionMessageParam]:
41 |         """
42 |         Get all messages. This method is required for conforming to the
43 |         MessageFormatter protocol.
44 |         """
45 |         return json.loads(self.messages_file.read_text())
46 | 
47 |     async def append(self, message: ChatCompletionMessageParam) -> None:
48 |         """
49 |         Append a message to the history. This method is required for conforming
50 |         to the MessageFormatter protocol.
51 |         """
52 |         messages = await self.get()
53 |         messages.append(message)
54 |         self.messages_file.write_text(json.dumps(messages, indent=2))
55 | 
56 |     async def extend(self, messages: list[ChatCompletionMessageParam]) -> None:
57 |         """
58 |         Append a list of messages to the history.
59 |         """
60 |         existing_messages = await self.get()
61 |         existing_messages.extend(messages)
62 |         self.messages_file.write_text(json.dumps(existing_messages, indent=2))
63 | 
64 |     async def set(self, messages: list[ChatCompletionMessageParam], vars: dict[str, Any]) -> None:
65 |         """
66 |         Completely replace the messages with the new messages.
67 |         """
68 |         self.messages_file.write_text(json.dumps(messages, indent=2))
69 | 
70 |     def delete_all(self) -> None:
71 |         self.messages_file.write_text("[]")
72 | 
```

--------------------------------------------------------------------------------
/libraries/dotnet/WorkbenchConnector/Constants.cs:
--------------------------------------------------------------------------------

```csharp
 1 | // Copyright (c) Microsoft. All rights reserved.
 2 | 
 3 | using System.Net.Http;
 4 | 
 5 | namespace Microsoft.SemanticWorkbench.Connector;
 6 | 
 7 | public static class Constants
 8 | {
 9 |     // Unique service ID
10 |     public const string HeaderServiceId = "X-Assistant-Service-ID";
11 | 
12 |     // Agent ID
13 |     public const string HeaderAgentId = "X-Assistant-ID";
14 | 
15 |     // HTTP methods
16 |     public static readonly HttpMethod[] HttpMethodsWithBody = [HttpMethod.Post, HttpMethod.Put, HttpMethod.Patch];
17 | 
18 |     // Registering the multi-agent service into the workbench connector
19 |     public static class AgentServiceRegistration
20 |     {
21 |         public const string Placeholder = "{assistant_service_id}";
22 |         public const string Path = "/assistant-service-registrations/{assistant_service_id}";
23 |     }
24 | 
25 |     // Sending a message into an existing conversation
26 |     public static class SendAgentMessage
27 |     {
28 |         public const string ConversationPlaceholder = "{conversation_id}";
29 |         public const string Path = "/conversations/{conversation_id}/messages";
30 |     }
31 | 
32 |     // Sending a temporary status to show inline in a conversation, before sending a message
33 |     public static class SendAgentStatusMessage
34 |     {
35 |         public const string AgentPlaceholder = "{agent_id}";
36 |         public const string ConversationPlaceholder = "{conversation_id}";
37 |         public const string Path = "/conversations/{conversation_id}/participants/{agent_id}";
38 |     }
39 | 
40 |     // Sending a notification about a state content change
41 |     public static class SendAgentConversationInsightsEvent
42 |     {
43 |         public const string AgentPlaceholder = "{agent_id}";
44 |         public const string ConversationPlaceholder = "{conversation_id}";
45 |         public const string Path = "/assistants/{agent_id}/states/events?conversation_id={conversation_id}";
46 |     }
47 | 
48 |     // Get list of files
49 |     public static class GetConversationFiles
50 |     {
51 |         public const string ConversationPlaceholder = "{conversation_id}";
52 |         public const string Path = "/conversations/{conversation_id}/files";
53 |     }
54 | 
55 |     // Download/Delete file
56 |     public static class ConversationFile
57 |     {
58 |         public const string ConversationPlaceholder = "{conversation_id}";
59 |         public const string FileNamePlaceholder = "{filename}";
60 |         public const string Path = "/conversations/{conversation_id}/files/{filename}";
61 |     }
62 | 
63 |     // Upload file
64 |     public static class UploadConversationFile
65 |     {
66 |         public const string ConversationPlaceholder = "{conversation_id}";
67 |         public const string Path = "/conversations/{conversation_id}/files";
68 |     }
69 | }
70 | 
```

--------------------------------------------------------------------------------
/libraries/python/assistant-extensions/assistant_extensions/chat_context_toolkit/virtual_filesystem/_archive_file_source.py:
--------------------------------------------------------------------------------

```python
 1 | from typing import Iterable, cast
 2 | 
 3 | from chat_context_toolkit.virtual_filesystem import DirectoryEntry, FileEntry, MountPoint
 4 | from openai.types.chat import ChatCompletionMessageParam
 5 | from semantic_workbench_assistant.assistant_app import ConversationContext
 6 | 
 7 | from ..archive._archive import archive_reader_for
 8 | from ..archive._summarizer import convert_oai_messages_to_xml
 9 | 
10 | 
11 | class ArchiveFileSource:
12 |     def __init__(self, context: ConversationContext, archive_storage_sub_directory: str = "archives") -> None:
13 |         self._archive_reader = archive_reader_for(
14 |             context=context, archive_storage_sub_directory=archive_storage_sub_directory
15 |         )
16 | 
17 |     async def list_directory(self, path: str) -> Iterable[DirectoryEntry | FileEntry]:
18 |         """
19 |         List files and directories at the specified path.
20 | 
21 |         Archive does not have a directory structure, so it only supports the root path "/".
22 |         """
23 |         if not path == "/":
24 |             raise FileNotFoundError("Archive does not have a directory structure, only the root path '/' is supported.")
25 | 
26 |         files: list[FileEntry] = []
27 |         async for manifest in self._archive_reader.list():
28 |             files.append(
29 |                 FileEntry(
30 |                     path=f"/{manifest.filename}",
31 |                     size=manifest.content_size_bytes or 0,
32 |                     timestamp=manifest.timestamp_most_recent,
33 |                     permission="read",
34 |                     description=manifest.summary,
35 |                 )
36 |             )
37 | 
38 |         return files
39 | 
40 |     async def read_file(self, path: str) -> str:
41 |         """
42 |         Read the content of a file at the specified path.
43 | 
44 |         Archive does not have a directory structure, so it only supports the root path "/".
45 |         """
46 | 
47 |         archive_path = path.lstrip("/")
48 | 
49 |         if not archive_path:
50 |             raise FileNotFoundError("Path must be specified, e.g. '/archive_filename.json'")
51 | 
52 |         content = await self._archive_reader.read(filename=archive_path)
53 | 
54 |         if content is None:
55 |             raise FileNotFoundError(f"File not found: '{path}'")
56 | 
57 |         return convert_oai_messages_to_xml(cast(list[ChatCompletionMessageParam], content.messages))
58 | 
59 | 
60 | def archive_file_source_mount(context: ConversationContext) -> MountPoint:
61 |     return MountPoint(
62 |         entry=DirectoryEntry(
63 |             path="/archives",
64 |             description="Archives of the conversation history that no longer fit in the context window.",
65 |             permission="read",
66 |         ),
67 |         file_source=ArchiveFileSource(context=context),
68 |     )
69 | 
```

--------------------------------------------------------------------------------
/workbench-service/semantic_workbench_service/controller/assistant_service_client_pool.py:
--------------------------------------------------------------------------------

```python
 1 | import asyncio
 2 | from typing import Self
 3 | 
 4 | from semantic_workbench_api_model.assistant_service_client import (
 5 |     AssistantClient,
 6 |     AssistantServiceClient,
 7 |     AssistantServiceClientBuilder,
 8 | )
 9 | 
10 | from .. import assistant_api_key, db
11 | 
12 | 
13 | class AssistantServiceClientPool:
14 |     def __init__(self, api_key_store: assistant_api_key.ApiKeyStore) -> None:
15 |         self._api_key_store = api_key_store
16 |         self._service_clients: dict[str, AssistantServiceClient] = {}
17 |         self._assistant_clients: dict[str, AssistantClient] = {}
18 |         self._client_lock = asyncio.Lock()
19 | 
20 |     def __aenter__(self) -> Self:
21 |         return self
22 | 
23 |     async def __aexit__(self, exc_type, exc_value, traceback) -> None:
24 |         for client in self._service_clients.values():
25 |             await client.aclose()
26 |         for client in self._assistant_clients.values():
27 |             await client.aclose()
28 | 
29 |     async def service_client(self, registration: db.AssistantServiceRegistration) -> AssistantServiceClient:
30 |         service_id = registration.assistant_service_id
31 |         url = registration.assistant_service_url
32 |         key = f"{service_id}-{url}"
33 | 
34 |         if key not in self._service_clients:
35 |             async with self._client_lock:
36 |                 if key not in self._service_clients:
37 |                     self._service_clients[key] = (await self._client_builder(registration)).for_service()
38 | 
39 |         return self._service_clients[key]
40 | 
41 |     async def assistant_client(self, assistant: db.Assistant) -> AssistantClient:
42 |         assistant_id = assistant.assistant_id
43 |         url = assistant.related_assistant_service_registration.assistant_service_url
44 |         key = f"{assistant_id}-{url}"
45 | 
46 |         if key not in self._assistant_clients:
47 |             async with self._client_lock:
48 |                 if key not in self._assistant_clients:
49 |                     self._assistant_clients[key] = (
50 |                         await self._client_builder(assistant.related_assistant_service_registration)
51 |                     ).for_assistant(assistant_id)
52 | 
53 |         return self._assistant_clients[key]
54 | 
55 |     async def _client_builder(
56 |         self,
57 |         registration: db.AssistantServiceRegistration,
58 |     ) -> AssistantServiceClientBuilder:
59 |         api_key = await self._api_key_store.get(registration.api_key_name)
60 |         if api_key is None:
61 |             raise RuntimeError(f"assistant service {registration.assistant_service_id} does not have API key set")
62 | 
63 |         return AssistantServiceClientBuilder(
64 |             base_url=str(registration.assistant_service_url),
65 |             api_key=api_key,
66 |         )
67 | 
```

--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/mcp_server/constants.py:
--------------------------------------------------------------------------------

```python
 1 | # Copyright (c) Microsoft. All rights reserved.
 2 | 
 3 | DEFAULT_DOC_EDIT_TASK = """You are an expert editor of a Microsoft Word document that the user has open next to an AI chat interface. \
 4 | An assistant will be driving the editing process over a period of turns. \
 5 | You are responsible for making the final judgement and edits for the current turn.
 6 | The assistant has provided you the following task:
 7 | <task>
 8 | {{task}}
 9 | </task>
10 | You should follow this task, if provided. DO NOT make more changes than are requested, even if the user had requested additional changes or their comments say to resolve things. \
11 | You will very likely make these changes in a future step, so focus on the current task with high quality.
12 | You should still make sure to consider the user's preferences and any additional context.
13 | When you are unsure how far to go with the edits, make smaller changes or ask the user/assistant for more information.
14 | Whenever possible, ground your edits on the provided context including the conversation with the user and any additionally provided context."""
15 | 
16 | DEFAULT_DRAFT_TASK = """The user's Word document is currently empty and you are starting a new document.
17 | An assistant will be driving the editing process over a period of turns. You are currently only responsible for the first turn.
18 | The assistant has provided you the following task:
19 | <task>
20 | {{task}}
21 | </task>
22 | You should follow this task, if provided. However also make sure to consider the entire context of the document, user's preferences, additional context, and the assistant's suggestions.
23 | If the task says to only provide an outline, then you should provide an outline. \
24 | However, if the task is more general, you should make sure to the draft the document to the appropriate depth and complexity to meet the user's needs."""
25 | 
26 | FEEDBACK_DOC_EDIT_TASK = """You are refining a Microsoft Word document to address comments that were provided by another assistant.
27 | In the last message, a feedback assistant provided feedback on the document that you should consider and incorporate into the document. \
28 | You should only incorporate the feedback that you can factually and accurately given the context you have available to you.
29 | Continue to respect the user's preferences and the document's style, unless the feedback explicitly asks you to change it.
30 | If none of the feedback is actionable, then choose to send a message to the user and ask them for the information you need to continue."""
31 | 
32 | CHANGE_SUMMARY_PREFIX = "[Document Editor]: "
33 | 
34 | FEEDBACK_ASSISTANT_PREFIX = "[Feedback Tool]: "
35 | 
36 | COMMENT_AUTHOR = "Feedback Tool"
37 | 
```

--------------------------------------------------------------------------------
/.devcontainer/POST_SETUP_README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Welcome to the Semantic Workbench Codespace
 2 | 
 3 | The steps below will help you get started with the Semantic Workbench app and service.
 4 | 
 5 | ## How to use
 6 | 
 7 | ### Connecting to the Codespace in the future
 8 | 
 9 | - Launch VS Code and open the command palette with the `F1` key or `Ctrl/Cmd+Shift+P`
10 | - Type `Codespaces: Connect to Codespace...` and select it
11 | - After the Codespace is ready, you will be prompted to open the workspace; click `Open Workspace`
12 | 
13 | ### Optimizing your Codespaces experience
14 | 
15 | See [OPTIMIZING_FOR_CODESPACES.md](./OPTIMIZING_FOR_CODESPACES.md) for tips on optimizing your Codespaces experience.
16 | 
17 | ### Start the app and service
18 | 
19 | - Use VS Code > `Run and Debug` (Ctrl/Cmd+Shift+D) > `semantic-workbench` to start the project
20 | - Open your browser and navigate to `https://127.0.0.1:4000`
21 |   - You may receive a warning about the app not being secure; click `Advanced` and `Proceed to localhost` to continue
22 | - You can now interact with the app and service in the browser
23 | 
24 | See the [README](../README.md) for more details on how to use the Semantic Workbench app and service.
25 | 
26 | ### Next steps:
27 | 
28 | - Launch an example assistant service:
29 |   - Using the [canonical assistant](../libraries/python/semantic-workbench-assistant/README.md)
30 |     - Use VS Code > `Run and Debug` (Ctrl/Cmd+Shift+D) > `canonical-assistant` to start the canonical assistant
31 |   - Using an [example assistant](../examples/)
32 |     - Use VS Code > `Run and Debug` (Ctrl/Cmd+Shift+D) > `launch assistant (examples/python/python-01-echo-bot)` to start the example assistant
33 |   - Or create your own assistant service by following the [Assistant Development Guide](../docs/ASSISTANT_DEVELOPMENT_GUIDE.md)
34 | - Add the assistant to the workbench app by clicking the `Add Assistant` button in the app and selecting the assistant from the list
35 | - Configure the assistant and interact with it in the app by clicking on the assistant in the list
36 | - From the assistant configuration screen, click `New Conversation` to start a new conversation with the assistant
37 | 
38 | ## Assistant service example
39 | 
40 | We have included an example Python assistant service that echos the user's input and can serve as a starting point for your own assistant service.
41 | 
42 | See the [python-01-echo-bot/README](../examples/python/python-01-echo-bot/README.md) for more details.
43 | 
44 | ## Deleting a Codespace
45 | 
46 | When you are done with a Codespace, you can delete it to free up resources.
47 | 
48 | - Visit the source repository on GitHub
49 | - Click on the `Code` button and select the Codespaces tab
50 | - Click on the `...` button next to the Codespace you want to delete
51 | - Select `Delete`
52 | 
```

--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/research/routines/evaluate_answer.py:
--------------------------------------------------------------------------------

```python
 1 | from typing import Any, cast
 2 | 
 3 | from openai_client import (
 4 |     CompletionError,
 5 |     create_system_message,
 6 |     create_user_message,
 7 |     extra_data,
 8 |     make_completion_args_serializable,
 9 |     validate_completion,
10 | )
11 | from pydantic import BaseModel
12 | from skill_library import AskUserFn, EmitFn, RunContext, RunRoutineFn
13 | from skill_library.logging import logger
14 | from skill_library.skills.common import CommonSkill
15 | 
16 | 
17 | async def main(
18 |     context: RunContext,
19 |     routine_state: dict[str, Any],
20 |     emit: EmitFn,
21 |     run: RunRoutineFn,
22 |     ask_user: AskUserFn,
23 |     question: str,
24 |     answer: str,
25 | ) -> tuple[bool, str]:
26 |     """Decide whether an answer actually answers a question well, and return a reason why."""
27 | 
28 |     common_skill = cast(CommonSkill, context.skills["common"])
29 |     language_model = common_skill.config.language_model
30 | 
31 |     class Output(BaseModel):
32 |         reasoning: str
33 |         is_good_answer: bool
34 | 
35 |     completion_args = {
36 |         "model": "gpt-4o",
37 |         "messages": [
38 |             create_system_message(
39 |                 (
40 |                     "Given a question and and an answer, reason through whether or not the answer actually answers the question. Return your reasoning and whether or not the answer is a good answer as JSON."
41 |                 )
42 |             ),
43 |             create_user_message((f"The question: {question}\n\bThe answer: {answer}\n\n")),
44 |         ],
45 |         "response_format": Output,
46 |     }
47 | 
48 |     logger.debug("Completion call.", extra=extra_data(make_completion_args_serializable(completion_args)))
49 |     metadata = {}
50 |     metadata["completion_args"] = make_completion_args_serializable(completion_args)
51 |     try:
52 |         completion = await language_model.beta.chat.completions.parse(
53 |             **completion_args,
54 |         )
55 |         validate_completion(completion)
56 |         logger.debug("Completion response.", extra=extra_data({"completion": completion.model_dump()}))
57 |         metadata["completion"] = completion.model_dump()
58 |     except Exception as e:
59 |         completion_error = CompletionError(e)
60 |         metadata["completion_error"] = completion_error.message
61 |         logger.error(
62 |             completion_error.message,
63 |             extra=extra_data({"completion_error": completion_error.body}),
64 |         )
65 |         raise completion_error from e
66 |     else:
67 |         response: Output = cast(Output, completion.choices[0].message.parsed)
68 |         metadata["is_good_answer"] = response.is_good_answer
69 |         metadata["reasoning"] = response.reasoning
70 |         return response.is_good_answer, response.reasoning
71 |     finally:
72 |         context.log("evaluate_answer", metadata)
73 | 
```

--------------------------------------------------------------------------------
/assistants/skill-assistant/assistant/skill_event_mapper.py:
--------------------------------------------------------------------------------

```python
 1 | from typing import Protocol
 2 | 
 3 | from events import events as skill_events
 4 | from semantic_workbench_api_model.workbench_model import (
 5 |     MessageType,
 6 |     NewConversationMessage,
 7 |     UpdateParticipant,
 8 | )
 9 | from semantic_workbench_assistant.assistant_app import (
10 |     ConversationContext,
11 | )
12 | 
13 | from .logging import extra_data, logger
14 | 
15 | 
16 | class SkillEventMapperProtocol(Protocol):
17 |     async def map(
18 |         self,
19 |         skill_event: skill_events.EventProtocol,
20 |     ) -> None: ...
21 | 
22 | 
23 | class SkillEventMapper(SkillEventMapperProtocol):
24 |     def __init__(self, conversation_context: ConversationContext) -> None:
25 |         self.conversation_context = conversation_context
26 | 
27 |     async def map(
28 |         self,
29 |         skill_event: skill_events.EventProtocol,
30 |     ) -> None:
31 |         """
32 |         Maps events emitted by the skill assistant (from running actions or
33 |         routines) to message types understood by the Semantic Workbench.
34 |         """
35 |         metadata = {"debug": skill_event.metadata} if skill_event.metadata else None
36 |         logger.debug(
37 |             "Mapping skill event to Workbench conversation message.",
38 |             extra_data({
39 |                 "event_id": skill_event.id,
40 |                 "conversation_context_id": self.conversation_context.id,
41 |             }),
42 |         )
43 | 
44 |         match skill_event:
45 |             case skill_events.MessageEvent():
46 |                 await self.conversation_context.send_messages(
47 |                     NewConversationMessage(
48 |                         content=skill_event.message or "",
49 |                         metadata=metadata,
50 |                     )
51 |                 )
52 | 
53 |             case skill_events.InformationEvent():
54 |                 if skill_event.message:
55 |                     await self.conversation_context.send_messages(
56 |                         NewConversationMessage(
57 |                             content=f"Information event: {skill_event.message}",
58 |                             message_type=MessageType.notice,
59 |                             metadata=metadata,
60 |                         ),
61 |                     )
62 | 
63 |             case skill_events.ErrorEvent():
64 |                 await self.conversation_context.send_messages(
65 |                     NewConversationMessage(
66 |                         content=skill_event.message or "",
67 |                         metadata=metadata,
68 |                     )
69 |                 )
70 | 
71 |             case skill_events.StatusUpdatedEvent():
72 |                 await self.conversation_context.update_participant_me(UpdateParticipant(status=skill_event.message))
73 | 
74 |             case _:
75 |                 logger.warning("Unhandled event.", extra_data({"event": skill_event}))
76 | 
```

--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/mcp_server/types.py:
--------------------------------------------------------------------------------

```python
  1 | # Copyright (c) Microsoft. All rights reserved.
  2 | 
  3 | from typing import Any, Callable, Literal
  4 | 
  5 | from mcp.server.fastmcp import Context
  6 | from mcp_extensions.llm.llm_types import MessageT, ToolCall
  7 | from pydantic import BaseModel, Field
  8 | 
  9 | from mcp_server.constants import COMMENT_AUTHOR, DEFAULT_DOC_EDIT_TASK
 10 | 
 11 | # region Feedback
 12 | 
 13 | 
 14 | class WordCommentData(BaseModel):
 15 |     id: str = Field(default="Unused")
 16 |     comment_text: str
 17 |     location_text: str
 18 |     date: str = Field(default="")
 19 |     author: str = Field(default=COMMENT_AUTHOR)
 20 |     occurrence: int = Field(default=1)
 21 | 
 22 | 
 23 | class FeedbackOutput(BaseModel):
 24 |     feedback_summary: str
 25 |     word_comment_data: list[WordCommentData] = Field(default_factory=list)
 26 |     reasoning: str
 27 |     tool_calls: list[ToolCall]
 28 |     llm_latency: float
 29 | 
 30 | 
 31 | class CommentAnalysisData(BaseModel):
 32 |     comment_data: WordCommentData
 33 |     output_message: str
 34 |     necessary_context_reasoning: str
 35 |     is_actionable: bool
 36 | 
 37 | 
 38 | class CommentAnalysisOutput(BaseModel):
 39 |     edit_instructions: str
 40 |     assistant_hints: str
 41 |     json_message: dict[str, Any]
 42 |     comment_analysis: list[CommentAnalysisData] = Field(default_factory=list)
 43 | 
 44 | 
 45 | # endregion
 46 | 
 47 | 
 48 | # region Evals
 49 | 
 50 | 
 51 | class CommentForEvals(BaseModel):
 52 |     location_text: str
 53 |     comment_text: str
 54 | 
 55 | 
 56 | class TestCase(BaseModel):
 57 |     test_case_name: str
 58 |     test_case_type: Literal["writing", "feedback", "comment_analysis"] = Field(default="writing")
 59 |     transcription_file: str
 60 |     open_document_markdown_file: str | None = Field(
 61 |         default=None, description="The txt or md file to load containing the document content."
 62 |     )
 63 |     next_ask: str
 64 |     attachments: list[str] = Field(default_factory=list)
 65 |     comments: list[CommentForEvals] = Field(default_factory=list)
 66 | 
 67 | 
 68 | # endregion
 69 | 
 70 | 
 71 | # region Markdown Edit
 72 | 
 73 | 
 74 | class CustomContext(BaseModel):
 75 |     chat_history: list[MessageT]
 76 |     document: str
 77 |     additional_context: str
 78 |     comments: list[WordCommentData] = Field(default_factory=list)
 79 | 
 80 | 
 81 | class MarkdownEditRequest(BaseModel):
 82 |     context: Context | CustomContext
 83 |     request_type: Literal["dev", "mcp"] = Field(default="mcp")
 84 |     chat_completion_client: Callable[..., Any] | None = Field(default=None)
 85 |     task: str = Field(default=DEFAULT_DOC_EDIT_TASK)
 86 |     additional_messages: list[MessageT] = Field(
 87 |         default_factory=list,
 88 |         description="Additional messages to add to the chat history. Useful for passing messages in multi-step routines.",
 89 |     )
 90 | 
 91 | 
 92 | class MarkdownEditOutput(BaseModel):
 93 |     change_summary: str
 94 |     output_message: str
 95 |     new_markdown: str
 96 |     reasoning: str
 97 |     tool_calls: list[ToolCall]
 98 |     llm_latency: float
 99 | 
100 | 
101 | # endregion
102 | 
```

--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/assistant/utils.py:
--------------------------------------------------------------------------------

```python
 1 | """
 2 | Utility functions for the knowledge transfer assistant module.
 3 | 
 4 | This module provides common utility functions used across the knowledge transfer assistant
 5 | codebase, helping to reduce code duplication and maintain consistency.
 6 | """
 7 | 
 8 | import pathlib
 9 | from typing import Optional, Tuple
10 | 
11 | from semantic_workbench_assistant.assistant_app import ConversationContext
12 | 
13 | from .logging import logger
14 | 
15 | DEFAULT_TEMPLATE_ID = "default"
16 | 
17 | 
18 | def load_text_include(filename) -> str:
19 |     """
20 |     Helper for loading an include from a text file.
21 | 
22 |     Args:
23 |         filename: The name of the text file to load from the text_includes directory
24 | 
25 |     Returns:
26 |         The content of the text file
27 |     """
28 |     # Get directory relative to this module
29 |     directory = pathlib.Path(__file__).parent
30 | 
31 |     # Get the file path for the prompt file
32 |     file_path = directory / "text_includes" / filename
33 | 
34 |     # Read the prompt from the file
35 |     return file_path.read_text()
36 | 
37 | 
38 | async def get_current_user(context: ConversationContext) -> Tuple[Optional[str], Optional[str]]:
39 |     """
40 |     Extract the current user ID and name from the conversation context.
41 | 
42 |     Args:
43 |         context: The conversation context to extract user information from
44 | 
45 |     Returns:
46 |         A tuple containing (user_id, user_name), both may be None if no user is found
47 |     """
48 |     participants = await context.get_participants()
49 |     user_id = None
50 |     user_name = None
51 | 
52 |     for participant in participants.participants:
53 |         if participant.role == "user":
54 |             user_id = participant.id
55 |             user_name = participant.name
56 |             break
57 | 
58 |     return user_id, user_name
59 | 
60 | 
61 | async def get_current_user_id(context: ConversationContext) -> Optional[str]:
62 |     """
63 |     Extract just the current user ID from the conversation context.
64 | 
65 |     Args:
66 |         context: The conversation context to extract user information from
67 | 
68 |     Returns:
69 |         The user ID, or None if no user is found
70 |     """
71 |     user_id, _ = await get_current_user(context)
72 |     return user_id
73 | 
74 | 
75 | async def require_current_user(context: ConversationContext, operation_name: str) -> Optional[str]:
76 |     """
77 |     Extract the current user ID and log an error if none is found.
78 | 
79 |     Args:
80 |         context: The conversation context to extract user information from
81 |         operation_name: Name of the operation requiring a user, for error logging
82 | 
83 |     Returns:
84 |         The user ID, or None if no user is found (after logging an error)
85 |     """
86 |     user_id = await get_current_user_id(context)
87 | 
88 |     if not user_id:
89 |         logger.error(f"Cannot {operation_name}: no user found in conversation")
90 | 
91 |     return user_id
92 | 
```
Page 26/145FirstPrevNextLast