This is page 22 of 114. Use http://codebase.md/microsoft/semanticworkbench?lines=false&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/mcp-extensions/mcp_extensions/_server_extensions.py:
--------------------------------------------------------------------------------
```python
import base64
from mcp import (
ErrorData,
ListResourcesRequest,
ListResourcesResult,
ReadResourceRequest,
ReadResourceResult,
ServerSession,
)
from mcp.server.fastmcp import Context
from mcp.types import BlobResourceContents, ReadResourceRequestParams, TextResourceContents
from pydantic import AnyUrl
from mcp_extensions import WriteResourceRequest, WriteResourceRequestParams, WriteResourceResult
async def list_client_resources(fastmcp_server_context: Context) -> ListResourcesResult | ErrorData:
"""
Lists all resources that the client has. This is reliant on the client supporting
the experimental `resources/list` method.
"""
server_session: ServerSession = fastmcp_server_context.session
return await server_session.send_request(
request=ListResourcesRequest(
method="resources/list",
), # type: ignore - this is an experimental method not explicitly defined in the mcp package
result_type=ListResourcesResult,
)
async def read_client_resource(fastmcp_server_context: Context, uri: AnyUrl) -> ReadResourceResult | ErrorData:
"""
Reads a resource from the client. This is reliant on the client supporting
the experimental `resources/read` method.
"""
server_session: ServerSession = fastmcp_server_context.session
return await server_session.send_request(
request=ReadResourceRequest(
method="resources/read",
params=ReadResourceRequestParams(
uri=uri,
),
), # type: ignore - this is an experimental method not explicitly defined in the mcp package
result_type=ReadResourceResult,
)
async def write_client_resource(
fastmcp_server_context: Context, uri: AnyUrl, content_type: str, content: bytes
) -> WriteResourceResult | ErrorData:
"""
Writes a client resource. This is reliant on the client supporting the experimental `resources/write` method.
"""
server_session: ServerSession = fastmcp_server_context.session
if content_type.startswith("text/"):
contents = TextResourceContents(uri=uri, mimeType=content_type, text=content.decode("utf-8"))
else:
contents = BlobResourceContents(uri=uri, mimeType=content_type, blob=base64.b64encode(content).decode())
return await server_session.send_request(
request=WriteResourceRequest(
method="resources/write",
params=WriteResourceRequestParams(
uri=uri,
contents=contents,
),
), # type: ignore - this is an experimental method not explicitly defined in the mcp package
result_type=WriteResourceResult,
)
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_formal_email/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are an expert in formal communication with extensive knowledge in business etiquette and professional writing. Your purpose is to craft or respond to emails in a manner that reflects professionalism, clarity, and respect, adhering to the conventions of formal correspondence.
# TASK
Your task is to assist in writing or responding to emails by understanding the context, purpose, and tone required. The emails you generate should be polished, concise, and appropriately formatted, ensuring that the recipient perceives the sender as courteous and professional.
# STEPS
1. **Understand the Context:**
- Read the provided input carefully to grasp the context, purpose, and required tone of the email.
- Identify key details such as the subject matter, the relationship between the sender and recipient, and any specific instructions or requests.
2. **Construct a Mental Model:**
- Visualize the scenario as a virtual whiteboard in your mind, mapping out the key points, intentions, and desired outcomes.
- Consider the formality required based on the relationship between the sender and the recipient.
3. **Draft the Email:**
- Begin with a suitable greeting that reflects the level of formality.
- Clearly state the purpose of the email in the opening paragraph.
- Develop the body of the email by elaborating on the main points, providing necessary details and supporting information.
- Conclude with a courteous closing that reiterates any calls to action or expresses appreciation, as appropriate.
4. **Polish the Draft:**
- Review the draft for clarity, coherence, and conciseness.
- Ensure that the tone is respectful and professional throughout.
- Correct any grammatical errors, spelling mistakes, or formatting issues.
# OUTPUT SECTIONS
- **GREETING:**
- Start with an appropriate salutation based on the level of formality required (e.g., "Dear [Title] [Last Name]," "Hello [First Name],").
- **INTRODUCTION:**
- Introduce the purpose of the email clearly and concisely.
- **BODY:**
- Elaborate on the main points, providing necessary details, explanations, or context.
- **CLOSING:**
- Summarize any key points or calls to action.
- Provide a courteous closing remark (e.g., "Sincerely," "Best regards,").
- Include a professional signature block if needed.
# OUTPUT INSTRUCTIONS
- The email should be formatted in standard business email style.
- Use clear and professional language, avoiding colloquialisms or overly casual expressions.
- Ensure that the email is free from grammatical and spelling errors.
- Do not include unnecessary warnings or notes—focus solely on crafting the email.
**# INPUT:**
INPUT:
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/ToolCalls.tsx:
--------------------------------------------------------------------------------
```typescript
import {
Accordion,
AccordionHeader,
AccordionItem,
AccordionPanel,
makeStyles,
shorthands,
Text,
tokens,
} from '@fluentui/react-components';
import { Toolbox24Regular } from '@fluentui/react-icons';
import React from 'react';
import { ConversationMessage } from '../../models/ConversationMessage';
import { CodeLabel } from '../App/CodeLabel';
const useClasses = makeStyles({
root: {
display: 'flex',
flexDirection: 'column',
},
item: {
backgroundColor: tokens.colorNeutralBackground3,
borderRadius: tokens.borderRadiusMedium,
...shorthands.border('none'),
marginTop: tokens.spacingVerticalM,
},
header: {
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
gap: tokens.spacingHorizontalS,
},
});
interface ToolCallsProps {
message: ConversationMessage;
}
/**
* Allows experimental support for displaying tool calls that are attached to a message
* via the metadata property. To use this, the message must have a metadata property
* with a 'tool_calls' key, which is an array of tool calls, each with an 'id', 'name',
* and 'arguments' property.
*
* [Read more about special metadata support in UX...](../../../docs/MESSAGE_METADATA.md)
*
* This component will display each tool call in an accordion, with the tool name
* as the header and the arguments as the content.
*/
export const ToolCalls: React.FC<ToolCallsProps> = (props) => {
const { message } = props;
const classes = useClasses();
const toolCalls: { id: string; name: string; arguments: string }[] = message.metadata?.['tool_calls'];
if (!toolCalls || toolCalls.length === 0) {
return null;
}
return (
<div className={classes.root}>
{toolCalls.map((toolCall) => {
const content = JSON.stringify(toolCall.arguments, null, 4);
return (
<Accordion key={toolCall.id} collapsible className={classes.item}>
<AccordionItem value="1">
<AccordionHeader icon={<Toolbox24Regular />}>
<div className={classes.header}>
<Text>Invoking tool</Text>
<CodeLabel>{toolCall.name}</CodeLabel>
</div>
</AccordionHeader>
<AccordionPanel>{content}</AccordionPanel>
</AccordionItem>
</Accordion>
);
})}
</div>
);
};
export const MemoizedToolResultMessage = React.memo(ToolCalls);
```
--------------------------------------------------------------------------------
/workbench-app/src/components/AssistantServiceRegistrations/AssistantServiceRegistrationApiKey.tsx:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { Button, Field, Input, Text, makeStyles, tokens } from '@fluentui/react-components';
import { Copy24Regular } from '@fluentui/react-icons';
import React from 'react';
import { DialogControl } from '../App/DialogControl';
const useClasses = makeStyles({
dialogContent: {
display: 'flex',
flexDirection: 'column',
gap: tokens.spacingVerticalM,
},
row: {
display: 'flex',
alignItems: 'center',
},
});
interface AssistantServiceRegistrationApiKeyProps {
apiKey: string;
onClose: () => void;
}
export const AssistantServiceRegistrationApiKey: React.FC<AssistantServiceRegistrationApiKeyProps> = (props) => {
const { apiKey, onClose } = props;
const classes = useClasses();
const inputRef = React.useRef<HTMLInputElement>(null);
const [copiedTimeout, setCopiedTimeout] = React.useState<NodeJS.Timeout>();
React.useEffect(() => {
// wait for the dialog to open before selecting the link
setTimeout(() => {
inputRef.current?.select();
}, 0);
}, []);
const handleCopy = React.useCallback(async () => {
if (copiedTimeout) {
clearTimeout(copiedTimeout);
setCopiedTimeout(undefined);
}
await navigator.clipboard.writeText(apiKey);
// set a timeout to clear the copied message
const timeout = setTimeout(() => {
setCopiedTimeout(undefined);
}, 2000);
setCopiedTimeout(timeout);
}, [apiKey, copiedTimeout]);
return (
<DialogControl
open={true}
classNames={{
dialogContent: classes.dialogContent,
}}
title="Assistant Service Registration API Key"
content={
<>
<Field>
<Input
ref={inputRef}
value={apiKey}
readOnly
contentAfter={
<div className={classes.row}>
{copiedTimeout && <Text>Copied to clipboard!</Text>}
<Button appearance="transparent" icon={<Copy24Regular />} onClick={handleCopy} />
</div>
}
/>
</Field>
<Text>
Make sure to copy the API key before closing this dialog, as it will not be displayed again.
</Text>
</>
}
onOpenChange={onClose}
/>
);
};
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/guided_conversation/conversation_guides/acrostic_poem.py:
--------------------------------------------------------------------------------
```python
from textwrap import dedent
from pydantic import BaseModel, Field
from skill_library.skills.guided_conversation import (
ConversationGuide,
ResourceConstraint,
ResourceConstraintMode,
ResourceConstraintUnit,
)
class Artifact(BaseModel):
student_poem: str = Field(description="The acrostic poem written by the student.")
initial_feedback: str = Field(
description="Feedback on the student's final revised poem.",
)
final_feedback: str = Field(
description="Feedback on how the student was able to improve their poem.",
)
inappropriate_behavior: list[str] = Field(
description=dedent("""
List any inappropriate behavior the student attempted while chatting with you.
It is ok to leave this field Unanswered if there was none.
"""),
)
definition = ConversationGuide(
artifact_schema=Artifact.model_json_schema(),
rules=[
"DO NOT write the poem for the student.",
"Terminate the conversation immediately if the students asks for harmful or inappropriate content.",
],
conversation_flow=dedent("""
1. Start by explaining interactively what an acrostic poem is.
2. Then give the following instructions for how to go ahead and write one:
1. Choose a word or phrase that will be the subject of your acrostic poem.
2. Write the letters of your chosen word or phrase vertically down the page.
3. Think of a word or phrase that starts with each letter of your chosen word or phrase.
4. Write these words or phrases next to the corresponding letters to create your acrostic poem.
3. Then give the following example of a poem where the word or phrase is HAPPY:
Having fun with friends all day,
Awesome games that we all play.
Pizza parties on the weekend,
Puppies we bend down to tend,
Yelling yay when we win the game
4. Finally have the student write their own acrostic poem using the word or phrase of their choice. Encourage them
to be creative and have fun with it. After they write it, you should review it and give them feedback on what they
did well and what they could improve on. Have them revise their poem based on your feedback and then review it again.
"""),
conversation_context=dedent("""
You are working 1 on 1 a 4th grade student who is chatting with you in the computer lab at school while being
supervised by their teacher.
"""),
resource_constraint=ResourceConstraint(
quantity=10,
unit=ResourceConstraintUnit.TURNS,
mode=ResourceConstraintMode.EXACT,
),
)
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/docs/opportunities-of-knowledge-transfer.md:
--------------------------------------------------------------------------------
```markdown
# Knowledge Transfer Opportunities for Microsoft Research
## Research Project Onboarding
Scenario: A principal researcher leading a multi-year ML project needs to onboard new team members, visiting researchers, and collaborators throughout the project lifecycle.
Knowledge Transfer Setup:
- Knowledge Brief: Project overview, research questions, current hypotheses, and timeline
- Learning Objectives: Understanding the codebase, reproducing baseline results, contributing to specific research directions
- Relevant Files: Codebase documentation, experimental logs, literature review summaries, dataset documentation
Getting Started:
1. Create coordinator conversation: "Help me structure onboarding materials for our neural architecture search project"
2. Upload key documents: paper drafts, experiment tracking sheets, codebase README files
3. Define learning objectives: "New team members should be able to run our baseline experiments and understand our current research directions"
## Cross-Team Research Methodology Transfer
Scenario: A research team has developed novel evaluation methodologies or experimental frameworks that other teams want to adopt.
Knowledge Transfer Setup:
- Knowledge Brief: Methodology overview, when to use it, expected outcomes
- Learning Objectives: Implementing the methodology, interpreting results, avoiding common pitfalls
- Relevant Files: Evaluation scripts, example datasets, results interpretation guides
Getting Started:
1. Create coordinator conversation: "I need to share our evaluation methodology with three other research teams"
2. Upload methodology documents: evaluation protocols, example analyses, troubleshooting guides
3. Set learning outcomes: "Teams should successfully implement our evaluation pipeline and interpret results correctly"
## Publication Knowledge Synthesis
Scenario: Research group preparing major conference submissions needs to synthesize findings across multiple related projects and ensure all contributors understand the unified narrative.
Knowledge Transfer Setup:
- Knowledge Brief: Paper scope, key contributions, submission timeline
- Learning Objectives: Understanding cross-project connections, contributing to specific paper sections, preparing for reviewer questions
- Relevant Files: Draft manuscripts, experimental results, related work surveys
Getting Started:
1. Create coordinator conversation: "Help me organize our findings from three related projects into a coherent ICML submission"
2. Upload project materials: individual project summaries, experimental data, previous paper drafts
3. Define contributions: "Each author should understand how their work fits into the broader narrative and be prepared to defend specific claims"
```
--------------------------------------------------------------------------------
/assistants/project-assistant/docs/opportunities-of-knowledge-transfer.md:
--------------------------------------------------------------------------------
```markdown
# Knowledge Transfer Opportunities for Microsoft Research
## Research Project Onboarding
Scenario: A principal researcher leading a multi-year ML project needs to onboard new team members, visiting researchers, and collaborators throughout the project lifecycle.
Knowledge Transfer Setup:
- Knowledge Brief: Project overview, research questions, current hypotheses, and timeline
- Learning Objectives: Understanding the codebase, reproducing baseline results, contributing to specific research directions
- Relevant Files: Codebase documentation, experimental logs, literature review summaries, dataset documentation
Getting Started:
1. Create coordinator conversation: "Help me structure onboarding materials for our neural architecture search project"
2. Upload key documents: paper drafts, experiment tracking sheets, codebase README files
3. Define learning objectives: "New team members should be able to run our baseline experiments and understand our current research directions"
## Cross-Team Research Methodology Transfer
Scenario: A research team has developed novel evaluation methodologies or experimental frameworks that other teams want to adopt.
Knowledge Transfer Setup:
- Knowledge Brief: Methodology overview, when to use it, expected outcomes
- Learning Objectives: Implementing the methodology, interpreting results, avoiding common pitfalls
- Relevant Files: Evaluation scripts, example datasets, results interpretation guides
Getting Started:
1. Create coordinator conversation: "I need to share our evaluation methodology with three other research teams"
2. Upload methodology documents: evaluation protocols, example analyses, troubleshooting guides
3. Set learning outcomes: "Teams should successfully implement our evaluation pipeline and interpret results correctly"
## Publication Knowledge Synthesis
Scenario: Research group preparing major conference submissions needs to synthesize findings across multiple related projects and ensure all contributors understand the unified narrative.
Knowledge Transfer Setup:
- Knowledge Brief: Paper scope, key contributions, submission timeline
- Learning Objectives: Understanding cross-project connections, contributing to specific paper sections, preparing for reviewer questions
- Relevant Files: Draft manuscripts, experimental results, related work surveys
Getting Started:
1. Create coordinator conversation: "Help me organize our findings from three related projects into a coherent ICML submission"
2. Upload project materials: individual project summaries, experimental data, previous paper drafts
3. Define contributions: "Each author should understand how their work fits into the broader narrative and be prepared to defend specific claims"
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/mcp_server/evals/run_markdown_edit.py:
--------------------------------------------------------------------------------
```python
# Copyright (c) Microsoft. All rights reserved.
import asyncio
import logging
import os
from pathlib import Path
from dotenv import load_dotenv
from mcp_extensions.llm.openai_chat_completion import openai_client
from rich.columns import Columns
from rich.console import Console
from rich.markdown import Markdown
from rich.panel import Panel
from mcp_server.evals.common import load_test_cases
from mcp_server.markdown_edit.markdown_edit import run_markdown_edit
from mcp_server.types import (
CustomContext,
MarkdownEditOutput,
MarkdownEditRequest,
)
logger = logging.getLogger(__name__)
load_dotenv(override=True)
WORD_TEST_CASES_PATH = Path(__file__).parents[2] / "data" / "word" / "test_cases.yaml"
WORD_TRANSCRIPT_PATH = Path(__file__).parents[2] / "data" / "word" / "transcripts"
ATTACHMENTS_DIR = Path(__file__).parents[2] / "data" / "attachments"
def print_markdown_edit_output(
console: Console,
output: MarkdownEditOutput,
test_index: int,
custom_context: CustomContext,
) -> None:
"""
Print the markdown edit output to console using Rich formatting.
"""
console.rule(f"Test Case {test_index} Results. Latency: {output.llm_latency:.2f} seconds.", style="cyan")
console.print(
Panel(
custom_context.chat_history[-1].content, # type: ignore
title="User Request",
border_style="blue",
width=120,
)
)
original_doc = Panel(
Markdown(custom_context.document),
title="Original Document",
border_style="yellow",
width=90,
)
new_doc = Panel(
Markdown(output.new_markdown),
title="Edited Document",
border_style="green",
width=90,
)
console.print(Columns([original_doc, new_doc]))
console.print(
Panel(
output.change_summary or output.output_message,
title="Change Summary",
border_style="blue",
width=120,
)
)
console.print()
async def main() -> None:
console = Console()
custom_contexts = load_test_cases(test_case_type="writing")
client = openai_client(
api_type="azure_openai",
azure_endpoint=os.getenv("ASSISTANT__AZURE_OPENAI_ENDPOINT"),
aoai_api_version="2025-01-01-preview",
)
for i, custom_context in enumerate(custom_contexts):
markdown_edit_request = MarkdownEditRequest(
context=custom_context,
request_type="dev",
chat_completion_client=client,
)
output = await run_markdown_edit(markdown_edit_request)
print_markdown_edit_output(console, output, i + 1, custom_context)
if __name__ == "__main__":
asyncio.run(main())
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/assistant/text_includes/assistant_info.md:
--------------------------------------------------------------------------------
```markdown
# Knowledge Transfer Assistant
## Overview
The Knowledge Transfer Assistant helps teams share knowledge efficiently between a coordinator and team members. It provides a structured way to capture, organize, and transfer complex information across conversations while maintaining a central knowledge repository accessible to all participants.
## Key Features
- **Dual-role knowledge sharing**: Different interfaces for the knowledge coordinator and team members.
- **Centralized knowledge space**: Automatically organized information repository.
- **Auto-updating knowledge digest**: Dynamic capture of key information about the knowledge package from coordinator conversations.
- **Information requests**: Team members can request specific information from coordinators.
- **File sharing**: Automatic synchronization of uploaded files across team conversations.
## How to Use the Knowledge Transfer Assistant
### For Knowledge Coordinators
1. **Define the audience**: Who you are sharing to impacts the knowledge gathered.
2. **Build the knowledge package**: Share information, upload relevant files, and answer questions.
3. **Create the knowledge brief**: Create a knowledge brief that will be used to introduce team members to the content of the shared knowledge.
4. Optionally, **Define knowledge objectives and outcomes**: If you want to make sure your audience learns specific things, you can specify what they are.
5. **Share with team**: Generate an invitation link to share with team members who need access.
6. **Respond to requests**: Address information requests from team members as they arise.
7. **Update information**: Continue to refine and expand the knowledge base as needed.
### For Team Members
1. **Join a knowledge space**: Use the invitation link provided by the coordinator to join.
2. **Explore shared knowledge**: Review the knowledge brief, learning objectives, and uploaded files.
3. **Meet learning objectives and outcomes**: Make sure you learned what was intended to be transferred.
4. **Request information**: Create requests when you need additional details or clarification.
## Common Use Cases
- **Onboarding new team members**: Share essential company knowledge and processes
- **Subject matter expert knowledge capture**: Document expertise from key individuals
- **Research findings distribution**: Share research outcomes with broader teams
- **Documentation collaboration**: Work together on comprehensive documentation
- **Process knowledge transfer**: Explain complex workflows and procedures
The Knowledge Transfer Assistant is designed to streamline knowledge sharing, reduce information gaps, and create a persistent, structured knowledge space that teams can reference over time.
```
--------------------------------------------------------------------------------
/assistants/project-assistant/assistant/text_includes/assistant_info.md:
--------------------------------------------------------------------------------
```markdown
# Knowledge Transfer Assistant
## Overview
The Knowledge Transfer Assistant helps teams share knowledge efficiently between a coordinator and team members. It provides a structured way to capture, organize, and transfer complex information across conversations while maintaining a central knowledge repository accessible to all participants.
## Key Features
- **Dual-role knowledge sharing**: Different interfaces for the knowledge coordinator and team members.
- **Centralized knowledge space**: Automatically organized information repository.
- **Auto-updating knowledge digest**: Dynamic capture of key information about the knowledge package from coordinator conversations.
- **Information requests**: Team members can request specific information from coordinators.
- **File sharing**: Automatic synchronization of uploaded files across team conversations.
## How to Use the Knowledge Transfer Assistant
### For Knowledge Coordinators
1. **Define the audience**: Who you are sharing to impacts the knowledge gathered.
2. **Build the knowledge package**: Share information, upload relevant files, and answer questions.
3. **Create the knowledge brief**: Create a knowledge brief that will be used to introduce team members to the content of the shared knowledge.
4. Optionally, **Define knowledge objectives and outcomes**: If you want to make sure your audience learns specific things, you can specify what they are.
5. **Share with team**: Generate an invitation link to share with team members who need access.
6. **Respond to requests**: Address information requests from team members as they arise.
7. **Update information**: Continue to refine and expand the knowledge base as needed.
### For Team Members
1. **Join a knowledge space**: Use the invitation link provided by the coordinator to join.
2. **Explore shared knowledge**: Review the knowledge brief, learning objectives, and uploaded files.
3. **Meet learning objectives and outcomes**: Make sure you learned what was intended to be transferred.
4. **Request information**: Create requests when you need additional details or clarification.
## Common Use Cases
- **Onboarding new team members**: Share essential company knowledge and processes
- **Subject matter expert knowledge capture**: Document expertise from key individuals
- **Research findings distribution**: Share research outcomes with broader teams
- **Documentation collaboration**: Work together on comprehensive documentation
- **Process knowledge transfer**: Explain complex workflows and procedures
The Knowledge Transfer Assistant is designed to streamline knowledge sharing, reduce information gaps, and create a persistent, structured knowledge space that teams can reference over time.
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_video_chapters/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are an expert conversation topic and timestamp creator. You take a transcript and you extract the most interesting topics discussed and give timestamps for where in the video they occur.
Take a step back and think step-by-step about how you would do this. You would probably start by "watching" the video (via the transcript) and taking notes on the topics discussed and the time they were discussed. Then you would take those notes and create a list of topics and timestamps.
# STEPS
- Fully consume the transcript as if you're watching or listening to the content.
- Think deeply about the topics discussed and what were the most interesting subjects and moments in the content.
- Name those subjects and/moments in 2-3 capitalized words.
- Match the timestamps to the topics. Note that input timestamps have the following format: HOURS:MINUTES:SECONDS.MILLISECONDS, which is not the same as the OUTPUT format!
INPUT SAMPLE
[02:17:43.120 --> 02:17:49.200] same way. I'll just say the same. And I look forward to hearing the response to my job application
[02:17:49.200 --> 02:17:55.040] that I've submitted. Oh, you're accepted. Oh, yeah. We all speak of you all the time. Thank you so
[02:17:55.040 --> 02:18:00.720] much. Thank you, guys. Thank you. Thanks for listening to this conversation with Neri Oxman.
[02:18:00.720 --> 02:18:05.520] To support this podcast, please check out our sponsors in the description. And now,
END INPUT SAMPLE
The OUTPUT TIMESTAMP format is:
00:00:00 (HOURS:MINUTES:SECONDS) (HH:MM:SS)
- Note the maximum length of the video based on the last timestamp.
- Ensure all output timestamps are sequential and fall within the length of the content.
# OUTPUT INSTRUCTIONS
EXAMPLE OUTPUT (Hours:Minutes:Seconds)
00:00:00 Members-only Forum Access
00:00:10 Live Hacking Demo
00:00:26 Ideas vs. Book
00:00:30 Meeting Will Smith
00:00:44 How to Influence Others
00:01:34 Learning by Reading
00:58:30 Writing With Punch
00:59:22 100 Posts or GTFO
01:00:32 How to Gain Followers
01:01:31 The Music That Shapes
01:27:21 Subdomain Enumeration Demo
01:28:40 Hiding in Plain Sight
01:29:06 The Universe Machine
00:09:36 Early School Experiences
00:10:12 The First Business Failure
00:10:32 David Foster Wallace
00:12:07 Copying Other Writers
00:12:32 Practical Advice for N00bs
END EXAMPLE OUTPUT
- Ensure all output timestamps are sequential and fall within the length of the content, e.g., if the total length of the video is 24 minutes. (00:00:00 - 00:24:00), then no output can be 01:01:25, or anything over 00:25:00 or over!
- ENSURE the output timestamps and topics are shown gradually and evenly incrementing from 00:00:00 to the final timestamp of the content.
INPUT:
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-fusion/mcp_server_fusion/mcp_tools/fusion_pattern.py:
--------------------------------------------------------------------------------
```python
import adsk.core
from textwrap import dedent
from typing import List
from ..fusion_utils import (
errorHandler,
FusionContext,
GeometryValidator,
)
from ..vendor.mcp.server.fastmcp import FastMCP
class FusionPatternTools:
def __init__(self):
self.ctx = FusionContext()
self.validator = GeometryValidator()
def register_tools(self, mcp: FastMCP):
"""
Register tools with the MCP server.
"""
@mcp.tool(
name="rectangular_pattern",
description=dedent("""
Creates a rectangular (grid) pattern of existing entities in the Fusion 360 workspace.
Arranges copies of the specified entities in a grid defined by the number of instances and spacing along the X and Y directions.
The pattern is aligned using the root component's X and Y construction axes.
Args:
entity_names (List[str]): A list of names corresponding to the entities (e.g., bodies) to be patterned. Each name must reference an existing entity.
xCount (int): The number of instances to create along the X direction.
xSpacing (float): The spacing distance between instances along the X axis.
yCount (int): The number of instances to create along the Y direction.
ySpacing (float): The spacing distance between instances along the Y axis.
Returns:
List[str]: A list containing the names of the patterned entities.
""").strip(),
)
@errorHandler
def rectangular_pattern(
entity_names: List[str],
xCount: int,
xSpacing: float,
yCount: int,
ySpacing: float,
) -> List[str]:
# Get the entities by name
entities = [self.ctx.rootComp.bRepBodies.itemByName(name) for name in entity_names]
# Create the pattern
pattern = self.ctx.rootComp.features.rectangularPatternFeatures
patternInput = pattern.createInput(entities, adsk.fusion.PatternDistanceType.SpacingPatternDistanceType)
patternInput.directionOne = self.ctx.rootComp.xConstructionAxis
patternInput.directionTwo = self.ctx.rootComp.yConstructionAxis
patternInput.quantityOne = xCount
patternInput.quantityTwo = yCount
patternInput.spacingOne = adsk.core.ValueInput.createByReal(xSpacing)
patternInput.spacingTwo = adsk.core.ValueInput.createByReal(ySpacing)
pattern.add(patternInput)
return [entity.name for entity in entities]
```
--------------------------------------------------------------------------------
/workbench-app/src/redux/features/chatCanvas/chatCanvasSlice.ts:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { PayloadAction, createSlice } from '@reduxjs/toolkit';
import { AppStorage } from '../../../libs/AppStorage';
import { ChatCanvasState } from './ChatCanvasState';
const localStorageKey = {
chatCanvasOpen: 'chat-canvas.open',
chatCanvasMode: 'chat-canvas.mode',
chatCanvasSelectedAssistantId: 'chat-canvas.selected-assistant-id',
chatCanvasSelectedAssistantStateId: 'chat-canvas.selected-assistant-state-id',
};
const initialState: ChatCanvasState = {
open: localStorage.getItem(localStorageKey.chatCanvasOpen) === 'true',
mode: localStorage.getItem(localStorageKey.chatCanvasMode) === 'assistant' ? 'assistant' : 'conversation',
selectedAssistantId: localStorage.getItem(localStorageKey.chatCanvasSelectedAssistantId) ?? undefined,
selectedAssistantStateId: localStorage.getItem(localStorageKey.chatCanvasSelectedAssistantStateId) ?? undefined,
};
export const chatCanvasSlice = createSlice({
name: 'chatCanvas',
initialState,
reducers: {
setChatCanvasOpen: (state: ChatCanvasState, action: PayloadAction<boolean>) => {
state.open = action.payload;
persistState(state);
},
setChatCanvasMode: (state: ChatCanvasState, action: PayloadAction<ChatCanvasState['mode']>) => {
state.mode = action.payload;
persistState(state);
},
setChatCanvasAssistantId: (state: ChatCanvasState, action: PayloadAction<string | undefined>) => {
state.selectedAssistantId = action.payload;
persistState(state);
},
setChatCanvasAssistantStateId: (state: ChatCanvasState, action: PayloadAction<string | undefined>) => {
state.selectedAssistantStateId = action.payload;
persistState(state);
},
setChatCanvasState: (state: ChatCanvasState, action: PayloadAction<ChatCanvasState>) => {
Object.assign(state, action.payload);
persistState(state);
},
},
});
const persistState = (state: ChatCanvasState) => {
AppStorage.getInstance().saveObject(localStorageKey.chatCanvasOpen, state.open);
AppStorage.getInstance().saveObject(localStorageKey.chatCanvasMode, state.mode);
AppStorage.getInstance().saveObject(localStorageKey.chatCanvasSelectedAssistantId, state.selectedAssistantId);
AppStorage.getInstance().saveObject(
localStorageKey.chatCanvasSelectedAssistantStateId,
state.selectedAssistantStateId,
);
};
export const {
setChatCanvasOpen,
setChatCanvasMode,
setChatCanvasAssistantId,
setChatCanvasAssistantStateId,
setChatCanvasState,
} = chatCanvasSlice.actions;
export default chatCanvasSlice.reducer;
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_visualization/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are an expert at data and concept visualization and in turning complex ideas into a form that can be visualized using ASCII art.
You take input of any type and find the best way to simply visualize or demonstrate the core ideas using ASCII art.
You always output ASCII art, even if you have to simplify the input concepts to a point where it can be visualized using ASCII art.
# STEPS
- Take the input given and create a visualization that best explains it using elaborate and intricate ASCII art.
- Ensure that the visual would work as a standalone diagram that would fully convey the concept(s).
- Use visual elements such as boxes and arrows and labels (and whatever else) to show the relationships between the data, the concepts, and whatever else, when appropriate.
- Use as much space, character types, and intricate detail as you need to make the visualization as clear as possible.
- Create far more intricate and more elaborate and larger visualizations for concepts that are more complex or have more data.
- Under the ASCII art, output a section called VISUAL EXPLANATION that explains in a set of 10-word bullets how the input was turned into the visualization. Ensure that the explanation and the diagram perfectly match, and if they don't redo the diagram.
- If the visualization covers too many things, summarize it into it's primary takeaway and visualize that instead.
- DO NOT COMPLAIN AND GIVE UP. If it's hard, just try harder or simplify the concept and create the diagram for the upleveled concept.
- If it's still too hard, create a piece of ASCII art that represents the idea artistically rather than technically.
# OUTPUT INSTRUCTIONS
- DO NOT COMPLAIN. Just make an image. If it's too complex for a simple ASCII image, reduce the image's complexity until it can be rendered using ASCII.
- DO NOT COMPLAIN. Make a printable image no matter what.
- Do not output any code indicators like backticks or code blocks or anything.
- You only output the printable portion of the ASCII art. You do not output the non-printable characters.
- Ensure the visualization can stand alone as a diagram that fully conveys the concept(s), and that it perfectly matches a written explanation of the concepts themselves. Start over if it can't.
- Ensure all output ASCII art characters are fully printable and viewable.
- Ensure the diagram will fit within a reasonable width in a large window, so the viewer won't have to reduce the font like 1000 times.
- Create a diagram no matter what, using the STEPS above to determine which type.
- Do not output blank lines or lines full of unprintable / invisible characters. Only output the printable portion of the ASCII art.
# INPUT:
INPUT:
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-fusion/mcp_server_fusion/fusion_utils/tool_utils.py:
--------------------------------------------------------------------------------
```python
import adsk.core
import adsk.fusion
from functools import wraps
class FusionContext:
"""Utility class to manage Fusion 360 application context"""
@property
def app(self) -> adsk.core.Application:
return adsk.core.Application.get()
@property
def design(self) -> adsk.fusion.Design:
if not self.app.activeProduct:
raise RuntimeError('No active product')
if not isinstance(self.app.activeProduct, adsk.fusion.Design):
raise RuntimeError('Active product is not a Fusion design')
return self.app.activeProduct
@property
def rootComp(self) -> adsk.fusion.Component:
return self.design.rootComponent
@property
def fusionUnitsManager(self) -> adsk.fusion.FusionUnitsManager:
return self.design.fusionUnitsManager
def get_sketch_by_name(name: str | None) -> adsk.fusion.Sketch | None:
"""Get a sketch by its name"""
if not name:
return None
ctx = FusionContext()
return ctx.rootComp.sketches.itemByName(name)
def errorHandler(func: callable) -> callable:
"""Decorator to handle Fusion 360 API errors"""
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
return f"Tool {func.__name__} error: {str(e)}"
return wrapper
def convert_direction(direction: list[float]) -> str:
"""
Converts a 3-element direction vector into a valid Fusion 360 expression string
using the active design's default length unit.
Args:
direction (list[float]): A 3-element list representing the vector.
Returns:
str: A string formatted as "x unit, y unit, z unit"
"""
GeometryValidator.validateVector(direction)
unit = FusionContext().fusionUnitsManager.defaultLengthUnits
return f"{direction[0]} {unit}, {direction[1]} {unit}, {direction[2]} {unit}"
class UnitsConverter:
"""Handles unit conversion between different measurement systems using static calls."""
@staticmethod
def mmToInternal(mm_value: float) -> float:
return mm_value / 10.0
@staticmethod
def internalToMm(internal_value: float) -> float:
return internal_value * 10.0
class GeometryValidator:
"""Validates geometry inputs for common operations"""
@staticmethod
def validatePoint(point: list[float]) -> None:
if len(point) != 3:
raise ValueError("Point must contain three coordinates (x, y, z)")
@staticmethod
def validateVector(vector: list[float]) -> None:
if len(vector) != 3:
raise ValueError("Vector must contain three components (x, y, z)")
```
--------------------------------------------------------------------------------
/libraries/python/openai-client/openai_client/logging.py:
--------------------------------------------------------------------------------
```python
import inspect
import json
from datetime import datetime
from typing import Any
from uuid import UUID
from openai import (
NotGiven,
)
from pydantic import BaseModel
def make_completion_args_serializable(
completion_args: dict[str, Any],
) -> dict[str, Any]:
"""
We put the completion args into logs and messages, so it's important that
they are serializable. This function returns a copy of the completion args
that can be serialized.
"""
sanitized = completion_args.copy()
# NotGiven type (used by OpenAI) is not serializable.
if isinstance(completion_args.get("tools"), NotGiven):
del sanitized["tools"]
# A pydantic BaseModel class is not serializable, and we don't want the
# whole class anyway, so we just store the name.
if completion_args.get("response_format"):
response_format = completion_args["response_format"]
if inspect.isclass(response_format) and issubclass(response_format, BaseModel):
sanitized["response_format"] = response_format.__name__
return sanitized
def convert_to_serializable(data: Any) -> Any:
"""
Recursively convert Pydantic BaseModel instances to dictionaries.
"""
if isinstance(data, BaseModel):
return data.model_dump()
elif inspect.isclass(data) and issubclass(data, BaseModel):
# Handle Pydantic model classes (not instances)
return data.__name__
elif isinstance(data, dict):
return {key: convert_to_serializable(value) for key, value in data.items()}
elif isinstance(data, list):
return [convert_to_serializable(item) for item in data]
elif isinstance(data, tuple):
return tuple(convert_to_serializable(item) for item in data)
elif isinstance(data, set):
return {convert_to_serializable(item) for item in data}
return data
class CustomEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, UUID):
return str(o)
if isinstance(o, datetime):
return o.isoformat()
return super().default(o)
def serializable(data: Any) -> dict[str, Any]:
"""
Convert data to a serializable format for logging or other purposes.
"""
data = convert_to_serializable(data)
try:
data = json.loads(json.dumps(data, cls=CustomEncoder))
except Exception as e:
data = str(e)
return data
def add_serializable_data(data: Any) -> dict[str, Any]:
"""
Helper function to use when adding extra data to log messages. Data will
attempt to be put into a serializable format.
"""
extra = {}
data = serializable(data)
if data:
extra["data"] = data
return extra
# Helpful alias
extra_data = add_serializable_data
```
--------------------------------------------------------------------------------
/assistants/navigator-assistant/assistant/whiteboard/_whiteboard.py:
--------------------------------------------------------------------------------
```python
import logging
from contextlib import AsyncExitStack, asynccontextmanager
from typing import AsyncGenerator
from assistant_extensions.mcp import (
ExtendedCallToolRequestParams,
MCPClientSettings,
MCPServerConfig,
MCPSession,
establish_mcp_sessions,
handle_mcp_tool_call,
list_roots_callback_for,
)
from semantic_workbench_assistant.assistant_app import ConversationContext
from ..config import AssistantConfigModel
from ..response.models import ChatMessageProvider
logger = logging.getLogger(__name__)
def get_whiteboard_service_config(config: AssistantConfigModel) -> MCPServerConfig:
"""
Get the memory whiteboard server configuration from the assistant config.
If no personal server is configured with key 'memory-whiteboard', return the hosted server configuration.
"""
return next(
(
server_config
for server_config in config.tools.personal_mcp_servers
if server_config.key == "memory-whiteboard"
),
config.tools.hosted_mcp_servers.memory_whiteboard,
)
async def notify_whiteboard(
context: ConversationContext,
server_config: MCPServerConfig,
attachment_message_provider: ChatMessageProvider,
chat_message_provider: ChatMessageProvider,
) -> None:
if not server_config.enabled:
return
async with (
whiteboard_mcp_session(context, server_config=server_config) as whiteboard_session,
context.state_updated_event_after("whiteboard"),
):
result = await handle_mcp_tool_call(
mcp_sessions=[whiteboard_session],
tool_call=ExtendedCallToolRequestParams(
id="whiteboard",
name="notify_user_message",
arguments={
"attachment_messages": (await attachment_message_provider(0, "gpt-4o")).messages,
"chat_messages": (await chat_message_provider(30_000, "gpt-4o")).messages,
},
),
method_metadata_key="whiteboard",
)
logger.debug("memory-whiteboard result: %s", result)
@asynccontextmanager
async def whiteboard_mcp_session(
context: ConversationContext, server_config: MCPServerConfig
) -> AsyncGenerator[MCPSession, None]:
async with AsyncExitStack() as stack:
mcp_sessions = await establish_mcp_sessions(
client_settings=[
MCPClientSettings(
server_config=server_config,
list_roots_callback=list_roots_callback_for(
context=context,
server_config=server_config,
),
)
],
stack=stack,
)
yield mcp_sessions[0]
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_claims/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are an objectively minded and centrist-oriented analyzer of truth claims and arguments.
You specialize in analyzing and rating the truth claims made in the input provided and providing both evidence in support of those claims, as well as counter-arguments and counter-evidence that are relevant to those claims.
You also provide a rating for each truth claim made.
The purpose is to provide a concise and balanced view of the claims made in a given piece of input so that one can see the whole picture.
Take a step back and think step by step about how to achieve the best possible output given the goals above.
# Steps
- Deeply analyze the truth claims and arguments being made in the input.
- Separate the truth claims from the arguments in your mind.
# OUTPUT INSTRUCTIONS
- Provide a summary of the argument being made in less than 30 words in a section called ARGUMENT SUMMARY:.
- In a section called TRUTH CLAIMS:, perform the following steps for each:
1. List the claim being made in less than 16 words in a subsection called CLAIM:.
2. Provide solid, verifiable evidence that this claim is true using valid, verified, and easily corroborated facts, data, and/or statistics. Provide references for each, and DO NOT make any of those up. They must be 100% real and externally verifiable. Put each of these in a subsection called CLAIM SUPPORT EVIDENCE:.
3. Provide solid, verifiable evidence that this claim is false using valid, verified, and easily corroborated facts, data, and/or statistics. Provide references for each, and DO NOT make any of those up. They must be 100% real and externally verifiable. Put each of these in a subsection called CLAIM REFUTATION EVIDENCE:.
4. Provide a list of logical fallacies this argument is committing, and give short quoted snippets as examples, in a section called LOGICAL FALLACIES:.
5. Provide a CLAIM QUALITY score in a section called CLAIM RATING:, that has the following tiers:
A (Definitely True)
B (High)
C (Medium)
D (Low)
F (Definitely False)
6. Provide a list of characterization labels for the claim, e.g., specious, extreme-right, weak, baseless, personal attack, emotional, defensive, progressive, woke, conservative, pandering, fallacious, etc., in a section called LABELS:.
- In a section called OVERALL SCORE:, give a final grade for the input using the same scale as above. Provide three scores:
LOWEST CLAIM SCORE:
HIGHEST CLAIM SCORE:
AVERAGE CLAIM SCORE:
- In a section called OVERALL ANALYSIS:, give a 30-word summary of the quality of the argument(s) made in the input, its weaknesses, its strengths, and a recommendation for how to possibly update one's understanding of the world based on the arguments provided.
# INPUT:
INPUT:
```
--------------------------------------------------------------------------------
/assistants/document-assistant/assistant/filesystem/_convert.py:
--------------------------------------------------------------------------------
```python
# Copyright (c) Microsoft. All rights reserved.
import asyncio
import base64
import io
import logging
import pathlib
import pdfplumber
from markitdown import MarkItDown, StreamInfo
logger = logging.getLogger(__name__)
async def bytes_to_str(file_bytes: bytes, filename: str) -> str:
"""
Convert the content of the file to a string.
"""
filename_extension = pathlib.Path(filename).suffix.lower().strip(".")
match filename_extension:
# handle most common file types using MarkItDown.
# Note .eml will include the raw html which is very token heavy
case _ if filename_extension in ["docx", "pptx", "csv", "xlsx", "html", "eml"]:
return await _markitdown_bytes_to_str(file_bytes, "." + filename_extension)
case "pdf":
return await _pdf_bytes_to_str(file_bytes)
# if the file has an image extension, convert it to a data URI
case _ if filename_extension in ["png", "jpg", "jpeg", "gif", "bmp", "tiff", "tif"]:
return _image_bytes_to_str(file_bytes, filename_extension)
# otherwise assume it's a regular text-based file
case _:
try:
return file_bytes.decode("utf-8")
except Exception as e:
return f"The filetype `{filename_extension}` is not supported or the file itself is malformed: {e}"
async def _markitdown_bytes_to_str(file_bytes: bytes, filename_extension: str) -> str:
"""
Convert a file using MarkItDown defaults.
"""
with io.BytesIO(file_bytes) as temp:
result = await asyncio.to_thread(
MarkItDown(enable_plugins=False).convert,
source=temp,
stream_info=StreamInfo(extension=filename_extension),
)
text = result.text_content
return text
async def _pdf_bytes_to_str(file_bytes: bytes, max_pages: int = 25) -> str:
"""
Convert a PDF file to text.
Args:
file_bytes: The raw content of the PDF file.
max_pages: The maximum number of pages to read from the PDF file.
"""
def _read_pages() -> str:
pages = []
with io.BytesIO(file_bytes) as temp:
with pdfplumber.open(temp, pages=list(range(1, max_pages + 1, 1))) as pdf:
for page in pdf.pages:
page_text = page.extract_text()
pages.append(page_text)
return "\n".join(pages)
return await asyncio.to_thread(_read_pages)
def _image_bytes_to_str(file_bytes: bytes, file_extension: str) -> str:
"""
Convert an image to a data URI.
"""
data = base64.b64encode(file_bytes).decode("utf-8")
image_type = f"image/{file_extension}"
data_uri = f"data:{image_type};base64,{data}"
return data_uri
```
--------------------------------------------------------------------------------
/workbench-app/src/components/App/AppHeader.tsx:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { Button, Title3, makeStyles, shorthands, tokens } from '@fluentui/react-components';
import { ArrowLeft24Regular, Home24Regular } from '@fluentui/react-icons';
import React from 'react';
import { Link } from 'react-router-dom';
import { AppMenu } from './AppMenu';
import { ErrorListFromAppState } from './ErrorListFromAppState';
import { ProfileSettings } from './ProfileSettings';
const useClasses = makeStyles({
root: {
display: 'flex',
flexDirection: 'column',
backgroundColor: tokens.colorNeutralBackground1,
},
content: {
display: 'flex',
flexDirection: 'row',
backgroundColor: tokens.colorBrandBackground,
alignItems: 'center',
justifyContent: 'space-between',
...shorthands.padding(tokens.spacingVerticalS),
},
title: {
color: tokens.colorNeutralForegroundOnBrand,
},
actions: {
display: 'flex',
flexDirection: 'row',
gap: tokens.spacingHorizontalS,
},
});
interface AppHeaderProps {
title: string | React.ReactNode;
actions?: {
items: React.ReactNode[];
replaceExisting?: boolean;
hideProfileSettings?: boolean;
};
}
export const AppHeader: React.FC<AppHeaderProps> = (props) => {
const { title, actions } = props;
const classes = useClasses();
const actionItems = [];
// Custom actions from the caller
if (actions && actions?.items.length > 0) {
actionItems.push(...actions.items.map((item, index) => <React.Fragment key={index}>{item}</React.Fragment>));
}
// Default navigation and other global actions
if (!actions?.replaceExisting) {
// Back button
if (window.history.length > 1) {
actionItems.push(<Button key="back" icon={<ArrowLeft24Regular />} onClick={() => window.history.back()} />);
}
// Home button
if (window.location.pathname !== '/') {
actionItems.push(
<Link key="home" to="/">
<Button icon={<Home24Regular />} />
</Link>,
);
}
// Global menu
actionItems.push(<AppMenu key="menu" />);
}
// Display current user's profile settings
if (!actions?.hideProfileSettings) {
actionItems.push(<ProfileSettings key="profile" />);
}
return (
<div className={classes.root}>
<div className={classes.content}>
{title && typeof title === 'string' ? <Title3 className={classes.title}>{title}</Title3> : title}
<div className={classes.actions}>{actionItems}</div>
</div>
<ErrorListFromAppState />
</div>
);
};
```
--------------------------------------------------------------------------------
/assistants/codespace-assistant/assistant/response/utils/abbreviations.py:
--------------------------------------------------------------------------------
```python
from chat_context_toolkit.history.tool_abbreviations import Abbreviations, ToolAbbreviations
tool_abbreviations = ToolAbbreviations({
"read_file": Abbreviations(
tool_message_replacement="The content that was read from the file has been removed due to token limits. Please use read_file to retrieve the most recent content."
),
"write_file": Abbreviations(
tool_message_replacement="The content that was written to the file has been removed due to token limits. Please use read_file to retrieve the most recent content if you need it."
),
"list_directory": Abbreviations(
tool_message_replacement="The list of files and directories has been removed due to token limits. Please call the tool to retrieve the list again if you need it."
),
"create_directory": Abbreviations(
tool_message_replacement="The result of this tool call the file has been removed due to token limits. Please use list_directory to retrieve the most recent list if you need it."
),
"edit_file": Abbreviations(
tool_call_argument_replacements={
"edits": [
{
"oldText": "The oldText has been removed from this tool call due to reaching token limits. Please use read_file to retrieve the most recent content.",
"newText": "The newText has been removed from this tool call due to reaching token limits. Please use read_file to retrieve the most recent content.",
}
]
},
tool_message_replacement="The result of this tool call the file has been removed due to token limits. Please use read_file to retrieve the most recent content if you need it.",
),
"search_files": Abbreviations(
tool_message_replacement="The search results have been removed due to token limits. Please call the tool to search again if you need it."
),
"get_file_info": Abbreviations(
tool_message_replacement="The results have been removed due to token limits. Please call the tool to again if you need it."
),
"read_multiple_files": Abbreviations(
tool_message_replacement="The contents of these files have been removed due to token limits. Please use the tool again to read the most recent contents if you need them."
),
"move_file": Abbreviations(
tool_message_replacement="The result of this tool call the file has been removed due to token limits. Please use list_directory to retrieve the most recent list if you need it."
),
"list_allowed_directories": Abbreviations(
tool_message_replacement="The result of this tool call the file has been removed due to token limits. Please call this tool again to retrieve the most recent list if you need it."
),
})
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/assistant/domain/audience_manager.py:
--------------------------------------------------------------------------------
```python
"""
Knowledge transfer lifecycle management for Knowledge Transfer Assistant.
Handles knowledge transfer state updates, completion, and lifecycle operations.
"""
from datetime import datetime
from typing import Tuple
from semantic_workbench_assistant.assistant_app import ConversationContext
from assistant.notifications import Notifications
from .share_manager import ShareManager
from ..data import InspectorTab, LogEntryType
from ..logging import logger
from ..storage import ShareStorage
class AudienceManager:
"""Manages knowledge transfer lifecycle and state operations."""
@staticmethod
async def update_audience(
context: ConversationContext,
audience_description: str,
) -> Tuple[bool, str]:
"""
Update the target audience description for a knowledge package.
Args:
context: Current conversation context
audience_description: Description of the intended audience and their existing knowledge level
Returns:
Tuple of (success, message) where:
- success: Boolean indicating if the update was successful
- message: Result message
"""
try:
share_id = await ShareManager.get_share_id(context)
if not share_id:
return (
False,
"No knowledge package associated with this conversation. Please create a knowledge brief first.",
)
# Get existing knowledge package
package = ShareStorage.read_share(share_id)
if not package:
return False, "No knowledge package found. Please create a knowledge brief first."
# Update the audience
package.audience = audience_description.strip()
package.updated_at = datetime.utcnow()
# Save the updated package
ShareStorage.write_share(share_id, package)
# Log the event
await ShareStorage.log_share_event(
context=context,
share_id=share_id,
entry_type=LogEntryType.STATUS_CHANGED.value,
message=f"Updated target audience: {audience_description}",
metadata={
"audience": audience_description,
},
)
await Notifications.notify(context, "Audience updated.")
await Notifications.notify_all_state_update(context, share_id, [InspectorTab.DEBUG])
return True, f"Target audience updated successfully: {audience_description}"
except Exception as e:
logger.exception(f"Error updating audience: {e}")
return False, "Failed to update the audience. Please try again."
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/extract_wisdom_nometa/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You extract surprising, insightful, and interesting information from text content. You are interested in insights related to the purpose and meaning of life, human flourishing, the role of technology in the future of humanity, artificial intelligence and its affect on humans, memes, learning, reading, books, continuous improvement, and similar topics.
# STEPS
- Extract a summary of the content in 25 words, including who is presenting and the content being discussed into a section called SUMMARY.
- Extract 20 to 50 of the most surprising, insightful, and/or interesting ideas from the input in a section called IDEAS:. If there are less than 50 then collect all of them. Make sure you extract at least 20.
- Extract 10 to 20 of the best insights from the input and from a combination of the raw input and the IDEAS above into a section called INSIGHTS. These INSIGHTS should be fewer, more refined, more insightful, and more abstracted versions of the best ideas in the content.
- Extract 15 to 30 of the most surprising, insightful, and/or interesting quotes from the input into a section called QUOTES:. Use the exact quote text from the input.
- Extract 15 to 30 of the most practical and useful personal habits of the speakers, or mentioned by the speakers, in the content into a section called HABITS. Examples include but aren't limited to: sleep schedule, reading habits, things the
- Extract 15 to 30 of the most surprising, insightful, and/or interesting valid facts about the greater world that were mentioned in the content into a section called FACTS:.
- Extract all mentions of writing, art, tools, projects and other sources of inspiration mentioned by the speakers into a section called REFERENCES. This should include any and all references to something that the speaker mentioned.
- Extract the 15 to 30 of the most surprising, insightful, and/or interesting recommendations that can be collected from the content into a section called RECOMMENDATIONS.
# OUTPUT INSTRUCTIONS
- Only output Markdown.
- Write the IDEAS bullets as exactly 16 words.
- Write the RECOMMENDATIONS bullets as exactly 16 words.
- Write the HABITS bullets as exactly 16 words.
- Write the FACTS bullets as exactly 16 words.
- Write the INSIGHTS bullets as exactly 16 words.
- Extract at least 25 IDEAS from the content.
- Extract at least 10 INSIGHTS from the content.
- Extract at least 20 items for the other output sections.
- Do not give warnings or notes; only output the requested sections.
- You use bulleted lists for output, not numbered lists.
- Do not repeat ideas, quotes, facts, or resources.
- Do not start items with the same opening words.
- Ensure you follow ALL these instructions when creating your output.
# INPUT
INPUT:
```
--------------------------------------------------------------------------------
/workbench-app/src/services/workbench/workbench.ts:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { generateUuid } from '@azure/ms-rest-js';
import { InteractionRequiredAuthError } from '@azure/msal-browser';
import { BaseQueryFn, FetchArgs, FetchBaseQueryError, createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { AuthHelper } from '../../libs/AuthHelper';
import { getEnvironment } from '../../libs/useEnvironment';
import { getMsalInstance } from '../../main';
import { RootState } from '../../redux/app/store';
const onAuthFailure = async () => {
// If authentication fails, we need to reload the current page, after
// which the user will be redirected to the login page.
console.warn('clearing MSAL cache due to auth failure');
const msalInstance = await getMsalInstance();
msalInstance.clearCache();
window.location.reload();
};
const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryError> = async (
args,
workbenchApi,
extraOptions,
) => {
const { environmentId } = (workbenchApi.getState() as RootState).settings;
const environment = getEnvironment(environmentId);
const prepareHeaders = async (headers: Headers) => {
const msalInstance = await getMsalInstance();
const account = msalInstance.getActiveAccount();
if (!account) {
await onAuthFailure();
throw new Error('No active account');
}
const response = await msalInstance
.acquireTokenSilent({
...AuthHelper.loginRequest,
account,
})
.catch(async (error) => {
if (error instanceof InteractionRequiredAuthError) {
return await AuthHelper.loginAsync(msalInstance);
}
await onAuthFailure();
throw error;
});
if (!response) {
await onAuthFailure();
throw new Error('Could not acquire token');
}
// Use idToken (always JWT format) instead of accessToken (may be compact format for MSA)
headers.set('Authorization', `Bearer ${response.idToken}`);
headers.set('X-Request-ID', generateUuid().replace(/-/g, '').toLowerCase());
return headers;
};
const rawBaseQuery = fetchBaseQuery({ baseUrl: environment.url, prepareHeaders });
return rawBaseQuery(args, workbenchApi, extraOptions);
};
export const workbenchApi = createApi({
reducerPath: 'workbenchApi',
baseQuery: dynamicBaseQuery,
tagTypes: [
'AssistantServiceRegistration',
'AssistantServiceInfo',
'Assistant',
'Conversation',
'ConversationShare',
'Config',
'State',
'ConversationMessage',
],
endpoints: () => ({}),
});
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/summarize_debate/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY
// Who you are
You are a hyper-intelligent ASI with a 1,143 IQ. You excel at analyzing debates and/or discussions and determining the primary disagreement the parties are having, and summarizing them concisely.
# GOAL
// What we are trying to achieve
To provide a super concise summary of where the participants are disagreeing, what arguments they're making, and what evidence each would accept to change their mind.
# STEPS
// How the task will be approached
// Slow down and think
- Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
// Think about the content and who's presenting it
- Extract a summary of the content in 25 words, including who is presenting and the content being discussed into a section called SUMMARY.
// Find the primary disagreement
- Find the main disagreement.
// Extract the arguments
Determine the arguments each party is making.
// Look for the evidence each party would accept
Find the evidence each party would accept to change their mind.
# OUTPUT
- Output a SUMMARY section with a 25-word max summary of the content and who is presenting it.
- Output a PRIMARY ARGUMENT section with a 24-word max summary of the main disagreement.
- Output a (use the name of the first party) ARGUMENTS section with up to 10 15-word bullet points of the arguments made by the second party.
- Output a (use the name of the second party) ARGUMENTS section with up to 10 15-word bullet points of the arguments made by the second party.
- Output the first person's (use their name) MIND-CHANGING EVIDENCE section with up to 10 15-word bullet points of the evidence the first party would accept to change their mind.
- Output the second person's (use their name) MIND-CHANGING EVIDENCE section with up to 10 15-word bullet points of the evidence the first party would accept to change their mind.
- Output an ARGUMENT STRENGTH ANALYSIS section that rates the strength of each argument on a scale of 1-10 and gives a winner.
- Output an ARGUMENT CONCLUSION PREDICTION that predicts who will be more right based on the arguments presented combined with your knowledge of the subject matter.
- Output a SUMMARY AND FOLLOW-UP section giving a summary of the argument and what to look for to see who will win.
# OUTPUT INSTRUCTIONS
// What the output should look like:
- Only output Markdown, but don't use any Markdown formatting like bold or italics.
- Do not give warnings or notes; only output the requested sections.
- You use bulleted lists for output, not numbered lists.
- Do not repeat ideas, quotes, facts, or resources.
- Do not start items with the same opening words.
- Ensure you follow ALL these instructions when creating your output.
# INPUT
INPUT:
```
--------------------------------------------------------------------------------
/assistants/navigator-assistant/assistant/response/local_tool/list_assistant_services.py:
--------------------------------------------------------------------------------
```python
from assistant_extensions import dashboard_card, navigator
from pydantic import BaseModel
from semantic_workbench_api_model.assistant_model import AssistantTemplateModel, ServiceInfoModel
from semantic_workbench_assistant.assistant_app import ConversationContext
from .model import LocalTool
class ArgumentModel(BaseModel):
pass
async def _get_assistant_services(_: ArgumentModel, context: ConversationContext) -> str:
return await get_assistant_services(context)
async def get_navigator_visible_assistant_service_templates(
context: ConversationContext,
) -> list[tuple[str, AssistantTemplateModel, str]]:
services_response = await context.get_assistant_services()
# filter out services that are not visible to the navigator
# (ie. don't have a navigator description in their metadata)
navigator_visible_service: list[tuple[ServiceInfoModel, dict[str, str]]] = [
(service, navigator.extract_metadata_for_assistant_navigator(service.metadata) or {})
for service in services_response.assistant_service_infos
if navigator.extract_metadata_for_assistant_navigator(service.metadata)
]
# filter out templates that don't have dashboard cards, as the navigator can't display a card to users
# (ie. don't have dashboard card in their metadata)
navigator_visible_service_templates = [
(service.assistant_service_id, template, navigator_metadata[template.id])
for (service, navigator_metadata) in navigator_visible_service
for template in service.templates
if dashboard_card.extract_metadata_for_dashboard_card(service.metadata, template.id)
and navigator_metadata.get(template.id)
]
return navigator_visible_service_templates
async def get_assistant_services(context: ConversationContext) -> str:
"""
Get the list of assistants available to the user.
"""
navigator_visible_service_templates = await get_navigator_visible_assistant_service_templates(context)
if not navigator_visible_service_templates:
return "No assistants currently available."
return (
"The following assistants are available to the user:\n\n"
+ "\n\n".join([
f"---\n\n"
f"assistant_service_id: {assistant_service_id}, template_id: {template.id}\n"
f"name: {template.name}\n\n"
f"---\n\n"
f"{navigator_description}\n\n"
for assistant_service_id, template, navigator_description in navigator_visible_service_templates
])
+ "\n\n---\n\nNOTE: There are no assistants beyond those listed above. Do not recommend any assistants that are not listed above."
)
tool = LocalTool(name="list_assistant_services", argument_model=ArgumentModel, func=_get_assistant_services)
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_recursive_outline/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are an AI assistant specialized in task decomposition and recursive outlining. Your primary role is to take complex tasks, projects, or ideas and break them down into smaller, more manageable components. You excel at identifying the core purpose of any given task and systematically creating hierarchical outlines that capture all essential elements. Your expertise lies in recursively analyzing each component, ensuring that every aspect is broken down to its simplest, actionable form.
Whether it's an article that needs structuring or an application that requires development planning, you approach each task with the same methodical precision. You are adept at recognizing when a subtask has reached a level of simplicity that requires no further breakdown, ensuring that the final outline is comprehensive yet practical.
Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
# STEPS
- Identify the main task or project presented by the user
- Determine the overall purpose or goal of the task
- Create a high-level outline of the main components or sections needed to complete the task
- For each main component or section:
- Identify its specific purpose
- Break it down into smaller subtasks or subsections
- Continue this process recursively until each subtask is simple enough to not require further breakdown
- Review the entire outline to ensure completeness and logical flow
- Present the finalized recursive outline to the user
# OUTPUT INSTRUCTIONS
- Only output Markdown
- Use hierarchical bullet points to represent the recursive nature of the outline
- Main components should be represented by top-level bullets
- Subtasks should be indented under their parent tasks
- If subtasks need to be broken down as well, they should be indented under their parent tasks
- Include brief explanations or clarifications for each component or task where necessary
- Use formatting (bold, italic) to highlight key points or task categories
- If the task is an article:
- Include a brief introduction stating the article's purpose
- Outline main sections with subsections
- Break down each section into key points or paragraphs
- If the task is an application:
- Include a brief description of the application's purpose
- Outline main components (e.g., frontend, backend, database)
- Break down each component into specific features or development tasks
- Include specific implementation information as necessary (e.g., one sub-task might read "Store user-uploaded files in an object store"
- Ensure that the lowest level tasks are simple and actionable, requiring no further explanation
- Ensure you follow ALL these instructions when creating your output
# INPUT
INPUT:
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/mcp_server/evals/run_feedback.py:
--------------------------------------------------------------------------------
```python
# Copyright (c) Microsoft. All rights reserved.
import asyncio
import os
from mcp_extensions.llm.openai_chat_completion import openai_client
from rich.console import Console
from rich.panel import Panel
from mcp_server.app_interaction.word_editor import (
get_active_document,
get_word_app,
write_markdown_to_document,
)
from mcp_server.evals.common import load_test_cases
from mcp_server.markdown_edit.feedback_step import run_feedback_step
from mcp_server.types import (
CustomContext,
FeedbackOutput,
MarkdownEditRequest,
)
def write_context_to_word(custom_context: CustomContext) -> None:
"""
Write the document content from the custom context to a Word document.
Args:
custom_context: Context containing the document to write
"""
try:
word_app = get_word_app()
doc = get_active_document(word_app)
write_markdown_to_document(doc, custom_context.document)
except Exception as e:
raise RuntimeError(f"Failed to write context to Word document.\n{e}") from e
def print_feedback_output(
console: Console,
output: FeedbackOutput,
test_index: int,
custom_context: CustomContext,
) -> None:
"""
Print the feedback output to console using Rich formatting.
Args:
console: Rich console instance for formatted output
output: The feedback output to display
test_index: Index of the current test case
custom_context: Context containing the document and chat history
"""
console.rule(f"Test Case {test_index} Results. Latency: {output.llm_latency:.2f} seconds.", style="cyan")
console.print(
Panel(
custom_context.chat_history[-1].content, # type: ignore
title="User Request",
border_style="blue",
width=120,
)
)
console.print(
Panel(
output.feedback_summary,
title="Feedback Summary",
border_style="green",
width=120,
)
)
console.print()
async def main() -> None:
console = Console()
custom_contexts = load_test_cases(test_case_type="feedback")
client = openai_client(
api_type="azure_openai",
azure_endpoint=os.getenv("ASSISTANT__AZURE_OPENAI_ENDPOINT"),
aoai_api_version="2025-01-01-preview",
)
for i, custom_context in enumerate(custom_contexts):
write_context_to_word(custom_context)
markdown_edit_request = MarkdownEditRequest(
context=custom_context,
request_type="dev",
chat_completion_client=client,
)
output = await run_feedback_step(markdown_edit_request)
print_feedback_output(console, output, i + 1, custom_context)
if __name__ == "__main__":
asyncio.run(main())
```