This is page 21 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
--------------------------------------------------------------------------------
/workbench-service/semantic_workbench_service/controller/assistant_service_client_pool.py:
--------------------------------------------------------------------------------
```python
import asyncio
from typing import Self
from semantic_workbench_api_model.assistant_service_client import (
AssistantClient,
AssistantServiceClient,
AssistantServiceClientBuilder,
)
from .. import assistant_api_key, db
class AssistantServiceClientPool:
def __init__(self, api_key_store: assistant_api_key.ApiKeyStore) -> None:
self._api_key_store = api_key_store
self._service_clients: dict[str, AssistantServiceClient] = {}
self._assistant_clients: dict[str, AssistantClient] = {}
self._client_lock = asyncio.Lock()
def __aenter__(self) -> Self:
return self
async def __aexit__(self, exc_type, exc_value, traceback) -> None:
for client in self._service_clients.values():
await client.aclose()
for client in self._assistant_clients.values():
await client.aclose()
async def service_client(self, registration: db.AssistantServiceRegistration) -> AssistantServiceClient:
service_id = registration.assistant_service_id
url = registration.assistant_service_url
key = f"{service_id}-{url}"
if key not in self._service_clients:
async with self._client_lock:
if key not in self._service_clients:
self._service_clients[key] = (await self._client_builder(registration)).for_service()
return self._service_clients[key]
async def assistant_client(self, assistant: db.Assistant) -> AssistantClient:
assistant_id = assistant.assistant_id
url = assistant.related_assistant_service_registration.assistant_service_url
key = f"{assistant_id}-{url}"
if key not in self._assistant_clients:
async with self._client_lock:
if key not in self._assistant_clients:
self._assistant_clients[key] = (
await self._client_builder(assistant.related_assistant_service_registration)
).for_assistant(assistant_id)
return self._assistant_clients[key]
async def _client_builder(
self,
registration: db.AssistantServiceRegistration,
) -> AssistantServiceClientBuilder:
api_key = await self._api_key_store.get(registration.api_key_name)
if api_key is None:
raise RuntimeError(f"assistant service {registration.assistant_service_id} does not have API key set")
return AssistantServiceClientBuilder(
base_url=str(registration.assistant_service_url),
api_key=api_key,
)
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/mcp_server/constants.py:
--------------------------------------------------------------------------------
```python
# Copyright (c) Microsoft. All rights reserved.
DEFAULT_DOC_EDIT_TASK = """You are an expert editor of a Microsoft Word document that the user has open next to an AI chat interface. \
An assistant will be driving the editing process over a period of turns. \
You are responsible for making the final judgement and edits for the current turn.
The assistant has provided you the following task:
<task>
{{task}}
</task>
You should follow this task, if provided. DO NOT make more changes than are requested, even if the user had requested additional changes or their comments say to resolve things. \
You will very likely make these changes in a future step, so focus on the current task with high quality.
You should still make sure to consider the user's preferences and any additional context.
When you are unsure how far to go with the edits, make smaller changes or ask the user/assistant for more information.
Whenever possible, ground your edits on the provided context including the conversation with the user and any additionally provided context."""
DEFAULT_DRAFT_TASK = """The user's Word document is currently empty and you are starting a new document.
An assistant will be driving the editing process over a period of turns. You are currently only responsible for the first turn.
The assistant has provided you the following task:
<task>
{{task}}
</task>
You should follow this task, if provided. However also make sure to consider the entire context of the document, user's preferences, additional context, and the assistant's suggestions.
If the task says to only provide an outline, then you should provide an outline. \
However, if the task is more general, you should make sure to the draft the document to the appropriate depth and complexity to meet the user's needs."""
FEEDBACK_DOC_EDIT_TASK = """You are refining a Microsoft Word document to address comments that were provided by another assistant.
In the last message, a feedback assistant provided feedback on the document that you should consider and incorporate into the document. \
You should only incorporate the feedback that you can factually and accurately given the context you have available to you.
Continue to respect the user's preferences and the document's style, unless the feedback explicitly asks you to change it.
If none of the feedback is actionable, then choose to send a message to the user and ask them for the information you need to continue."""
CHANGE_SUMMARY_PREFIX = "[Document Editor]: "
FEEDBACK_ASSISTANT_PREFIX = "[Feedback Tool]: "
COMMENT_AUTHOR = "Feedback Tool"
```
--------------------------------------------------------------------------------
/.devcontainer/POST_SETUP_README.md:
--------------------------------------------------------------------------------
```markdown
# Welcome to the Semantic Workbench Codespace
The steps below will help you get started with the Semantic Workbench app and service.
## How to use
### Connecting to the Codespace in the future
- Launch VS Code and open the command palette with the `F1` key or `Ctrl/Cmd+Shift+P`
- Type `Codespaces: Connect to Codespace...` and select it
- After the Codespace is ready, you will be prompted to open the workspace; click `Open Workspace`
### Optimizing your Codespaces experience
See [OPTIMIZING_FOR_CODESPACES.md](./OPTIMIZING_FOR_CODESPACES.md) for tips on optimizing your Codespaces experience.
### Start the app and service
- Use VS Code > `Run and Debug` (Ctrl/Cmd+Shift+D) > `semantic-workbench` to start the project
- Open your browser and navigate to `https://127.0.0.1:4000`
- You may receive a warning about the app not being secure; click `Advanced` and `Proceed to localhost` to continue
- You can now interact with the app and service in the browser
See the [README](../README.md) for more details on how to use the Semantic Workbench app and service.
### Next steps:
- Launch an example assistant service:
- Using the [canonical assistant](../libraries/python/semantic-workbench-assistant/README.md)
- Use VS Code > `Run and Debug` (Ctrl/Cmd+Shift+D) > `canonical-assistant` to start the canonical assistant
- Using an [example assistant](../examples/)
- Use VS Code > `Run and Debug` (Ctrl/Cmd+Shift+D) > `launch assistant (examples/python/python-01-echo-bot)` to start the example assistant
- Or create your own assistant service by following the [Assistant Development Guide](../docs/ASSISTANT_DEVELOPMENT_GUIDE.md)
- Add the assistant to the workbench app by clicking the `Add Assistant` button in the app and selecting the assistant from the list
- Configure the assistant and interact with it in the app by clicking on the assistant in the list
- From the assistant configuration screen, click `New Conversation` to start a new conversation with the assistant
## Assistant service example
We have included an example Python assistant service that echos the user's input and can serve as a starting point for your own assistant service.
See the [python-01-echo-bot/README](../examples/python/python-01-echo-bot/README.md) for more details.
## Deleting a Codespace
When you are done with a Codespace, you can delete it to free up resources.
- Visit the source repository on GitHub
- Click on the `Code` button and select the Codespaces tab
- Click on the `...` button next to the Codespace you want to delete
- Select `Delete`
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/research/routines/evaluate_answer.py:
--------------------------------------------------------------------------------
```python
from typing import Any, cast
from openai_client import (
CompletionError,
create_system_message,
create_user_message,
extra_data,
make_completion_args_serializable,
validate_completion,
)
from pydantic import BaseModel
from skill_library import AskUserFn, EmitFn, RunContext, RunRoutineFn
from skill_library.logging import logger
from skill_library.skills.common import CommonSkill
async def main(
context: RunContext,
routine_state: dict[str, Any],
emit: EmitFn,
run: RunRoutineFn,
ask_user: AskUserFn,
question: str,
answer: str,
) -> tuple[bool, str]:
"""Decide whether an answer actually answers a question well, and return a reason why."""
common_skill = cast(CommonSkill, context.skills["common"])
language_model = common_skill.config.language_model
class Output(BaseModel):
reasoning: str
is_good_answer: bool
completion_args = {
"model": "gpt-4o",
"messages": [
create_system_message(
(
"Given a question and and an answer, reason through whether or not the answer actually answers the question. Return your reasoning and whether or not the answer is a good answer as JSON."
)
),
create_user_message((f"The question: {question}\n\bThe answer: {answer}\n\n")),
],
"response_format": Output,
}
logger.debug("Completion call.", extra=extra_data(make_completion_args_serializable(completion_args)))
metadata = {}
metadata["completion_args"] = make_completion_args_serializable(completion_args)
try:
completion = await language_model.beta.chat.completions.parse(
**completion_args,
)
validate_completion(completion)
logger.debug("Completion response.", extra=extra_data({"completion": completion.model_dump()}))
metadata["completion"] = completion.model_dump()
except Exception as e:
completion_error = CompletionError(e)
metadata["completion_error"] = completion_error.message
logger.error(
completion_error.message,
extra=extra_data({"completion_error": completion_error.body}),
)
raise completion_error from e
else:
response: Output = cast(Output, completion.choices[0].message.parsed)
metadata["is_good_answer"] = response.is_good_answer
metadata["reasoning"] = response.reasoning
return response.is_good_answer, response.reasoning
finally:
context.log("evaluate_answer", metadata)
```
--------------------------------------------------------------------------------
/assistants/skill-assistant/assistant/skill_event_mapper.py:
--------------------------------------------------------------------------------
```python
from typing import Protocol
from events import events as skill_events
from semantic_workbench_api_model.workbench_model import (
MessageType,
NewConversationMessage,
UpdateParticipant,
)
from semantic_workbench_assistant.assistant_app import (
ConversationContext,
)
from .logging import extra_data, logger
class SkillEventMapperProtocol(Protocol):
async def map(
self,
skill_event: skill_events.EventProtocol,
) -> None: ...
class SkillEventMapper(SkillEventMapperProtocol):
def __init__(self, conversation_context: ConversationContext) -> None:
self.conversation_context = conversation_context
async def map(
self,
skill_event: skill_events.EventProtocol,
) -> None:
"""
Maps events emitted by the skill assistant (from running actions or
routines) to message types understood by the Semantic Workbench.
"""
metadata = {"debug": skill_event.metadata} if skill_event.metadata else None
logger.debug(
"Mapping skill event to Workbench conversation message.",
extra_data({
"event_id": skill_event.id,
"conversation_context_id": self.conversation_context.id,
}),
)
match skill_event:
case skill_events.MessageEvent():
await self.conversation_context.send_messages(
NewConversationMessage(
content=skill_event.message or "",
metadata=metadata,
)
)
case skill_events.InformationEvent():
if skill_event.message:
await self.conversation_context.send_messages(
NewConversationMessage(
content=f"Information event: {skill_event.message}",
message_type=MessageType.notice,
metadata=metadata,
),
)
case skill_events.ErrorEvent():
await self.conversation_context.send_messages(
NewConversationMessage(
content=skill_event.message or "",
metadata=metadata,
)
)
case skill_events.StatusUpdatedEvent():
await self.conversation_context.update_participant_me(UpdateParticipant(status=skill_event.message))
case _:
logger.warning("Unhandled event.", extra_data({"event": skill_event}))
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/mcp_server/types.py:
--------------------------------------------------------------------------------
```python
# Copyright (c) Microsoft. All rights reserved.
from typing import Any, Callable, Literal
from mcp.server.fastmcp import Context
from mcp_extensions.llm.llm_types import MessageT, ToolCall
from pydantic import BaseModel, Field
from mcp_server.constants import COMMENT_AUTHOR, DEFAULT_DOC_EDIT_TASK
# region Feedback
class WordCommentData(BaseModel):
id: str = Field(default="Unused")
comment_text: str
location_text: str
date: str = Field(default="")
author: str = Field(default=COMMENT_AUTHOR)
occurrence: int = Field(default=1)
class FeedbackOutput(BaseModel):
feedback_summary: str
word_comment_data: list[WordCommentData] = Field(default_factory=list)
reasoning: str
tool_calls: list[ToolCall]
llm_latency: float
class CommentAnalysisData(BaseModel):
comment_data: WordCommentData
output_message: str
necessary_context_reasoning: str
is_actionable: bool
class CommentAnalysisOutput(BaseModel):
edit_instructions: str
assistant_hints: str
json_message: dict[str, Any]
comment_analysis: list[CommentAnalysisData] = Field(default_factory=list)
# endregion
# region Evals
class CommentForEvals(BaseModel):
location_text: str
comment_text: str
class TestCase(BaseModel):
test_case_name: str
test_case_type: Literal["writing", "feedback", "comment_analysis"] = Field(default="writing")
transcription_file: str
open_document_markdown_file: str | None = Field(
default=None, description="The txt or md file to load containing the document content."
)
next_ask: str
attachments: list[str] = Field(default_factory=list)
comments: list[CommentForEvals] = Field(default_factory=list)
# endregion
# region Markdown Edit
class CustomContext(BaseModel):
chat_history: list[MessageT]
document: str
additional_context: str
comments: list[WordCommentData] = Field(default_factory=list)
class MarkdownEditRequest(BaseModel):
context: Context | CustomContext
request_type: Literal["dev", "mcp"] = Field(default="mcp")
chat_completion_client: Callable[..., Any] | None = Field(default=None)
task: str = Field(default=DEFAULT_DOC_EDIT_TASK)
additional_messages: list[MessageT] = Field(
default_factory=list,
description="Additional messages to add to the chat history. Useful for passing messages in multi-step routines.",
)
class MarkdownEditOutput(BaseModel):
change_summary: str
output_message: str
new_markdown: str
reasoning: str
tool_calls: list[ToolCall]
llm_latency: float
# endregion
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/assistant/utils.py:
--------------------------------------------------------------------------------
```python
"""
Utility functions for the knowledge transfer assistant module.
This module provides common utility functions used across the knowledge transfer assistant
codebase, helping to reduce code duplication and maintain consistency.
"""
import pathlib
from typing import Optional, Tuple
from semantic_workbench_assistant.assistant_app import ConversationContext
from .logging import logger
DEFAULT_TEMPLATE_ID = "default"
def load_text_include(filename) -> str:
"""
Helper for loading an include from a text file.
Args:
filename: The name of the text file to load from the text_includes directory
Returns:
The content of the text file
"""
# Get directory relative to this module
directory = pathlib.Path(__file__).parent
# Get the file path for the prompt file
file_path = directory / "text_includes" / filename
# Read the prompt from the file
return file_path.read_text()
async def get_current_user(context: ConversationContext) -> Tuple[Optional[str], Optional[str]]:
"""
Extract the current user ID and name from the conversation context.
Args:
context: The conversation context to extract user information from
Returns:
A tuple containing (user_id, user_name), both may be None if no user is found
"""
participants = await context.get_participants()
user_id = None
user_name = None
for participant in participants.participants:
if participant.role == "user":
user_id = participant.id
user_name = participant.name
break
return user_id, user_name
async def get_current_user_id(context: ConversationContext) -> Optional[str]:
"""
Extract just the current user ID from the conversation context.
Args:
context: The conversation context to extract user information from
Returns:
The user ID, or None if no user is found
"""
user_id, _ = await get_current_user(context)
return user_id
async def require_current_user(context: ConversationContext, operation_name: str) -> Optional[str]:
"""
Extract the current user ID and log an error if none is found.
Args:
context: The conversation context to extract user information from
operation_name: Name of the operation requiring a user, for error logging
Returns:
The user ID, or None if no user is found (after logging an error)
"""
user_id = await get_current_user_id(context)
if not user_id:
logger.error(f"Cannot {operation_name}: no user found in conversation")
return user_id
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_threat_report_cmds/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are tasked with interpreting and responding to cybersecurity-related prompts by synthesizing information from a diverse panel of experts in the field. Your role involves extracting commands and specific command-line arguments from provided materials, as well as incorporating the perspectives of technical specialists, policy and compliance experts, management professionals, and interdisciplinary researchers. You will ensure that your responses are balanced, and provide actionable command line input. You should aim to clarify complex commands for non-experts. Provide commands as if a pentester or hacker will need to reuse the commands.
Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
# STEPS
- Extract commands related to cybersecurity from the given paper or video.
- Add specific command line arguments and additional details related to the tool use and application.
- Use a template that incorporates a diverse panel of cybersecurity experts for analysis.
- Reference recent research and reports from reputable sources.
- Use a specific format for citations.
- Maintain a professional tone while making complex topics accessible.
- Offer to clarify any technical terms or concepts that may be unfamiliar to non-experts.
# OUTPUT INSTRUCTIONS
- The only output format is Markdown.
- Ensure you follow ALL these instructions when creating your output.
## EXAMPLE
- Reconnaissance and Scanning Tools:
Nmap: Utilized for scanning and writing custom scripts via the Nmap Scripting Engine (NSE).
Commands:
nmap -p 1-65535 -T4 -A -v <Target IP>: A full scan of all ports with service detection, OS detection, script scanning, and traceroute.
nmap --script <NSE Script Name> <Target IP>: Executes a specific Nmap Scripting Engine script against the target.
- Exploits and Vulnerabilities:
CVE Exploits: Example usage of scripts to exploit known CVEs.
Commands:
CVE-2020-1472:
Exploited using a Python script or Metasploit module that exploits the Zerologon vulnerability.
CVE-2021-26084:
python confluence_exploit.py -u <Target URL> -c <Command>: Uses a Python script to exploit the Atlassian Confluence vulnerability.
- BloodHound: Used for Active Directory (AD) reconnaissance.
Commands:
SharpHound.exe -c All: Collects data from the AD environment to find attack paths.
CrackMapExec: Used for post-exploitation automation.
Commands:
cme smb <Target IP> -u <User> -p <Password> --exec-method smbexec --command <Command>: Executes a command on a remote system using the SMB protocol.
# INPUT
INPUT:
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-filesystem-edit/mcp_server_filesystem_edit/types.py:
--------------------------------------------------------------------------------
```python
# Copyright (c) Microsoft. All rights reserved.
from typing import Any, Callable, Literal
from mcp.server.fastmcp import Context
from mcp_extensions.llm.llm_types import MessageT, ToolCall
from pydantic import BaseModel, Field
class CustomContext(BaseModel):
chat_history: list[MessageT]
document: str
file_type: Literal["markdown", "latex"] = Field(default="markdown")
additional_context: str
class FileOpRequest(BaseModel):
context: Context | CustomContext
request_type: Literal["dev", "mcp"] = Field(default="mcp")
chat_completion_client: Callable[..., Any] | None = Field(default=None)
file_type: Literal["markdown", "latex", "word", "powerpoint"] = Field(default="markdown")
file_content: str = Field(default="")
task: str = Field(default="")
class EditOutput(BaseModel):
change_summary: str
output_message: str
new_content: str
reasoning: str
tool_calls: list[ToolCall]
llm_latency: float
class CommentOutput(BaseModel):
new_content: str
comment_instructions: str
reasoning: str
tool_calls: list[ToolCall]
llm_latency: float
class Block(BaseModel):
id: int
content: str
class EditOperation(BaseModel):
type: str
class InsertOperation(EditOperation):
type: str = "insert"
index: int
content: str
class UpdateOperation(EditOperation):
type: str = "update"
index: int
content: str
class RemoveOperation(EditOperation):
type: str = "remove"
start_index: int
end_index: int
class TestCase(BaseModel):
test_case_name: str
test_case_type: Literal["writing", "comments", "presentation"] = Field(default="writing")
file_type: Literal["markdown", "latex"] = Field(default="markdown")
transcription_file: str
open_file: str | None = Field(
default=None, description="The txt or md file to load containing the document content."
)
next_ask: str
attachments: list[str] = Field(default_factory=list)
class FileOpTelemetry(BaseModel):
reasoning_latency: float = Field(default=0.0, description="Time spent on reasoning LLM call in seconds")
convert_latency: float = Field(default=0.0, description="Time spent on convert LLM call in seconds")
change_summary_latency: float = Field(default=0.0, description="Time spent on change summary LLM call in seconds")
total_latency: float = Field(default=0.0, description="Total LLM latency in seconds")
def reset(self) -> None:
self.reasoning_latency = 0.0
self.convert_latency = 0.0
self.change_summary_latency = 0.0
self.total_latency = 0.0
```
--------------------------------------------------------------------------------
/libraries/python/openai-client/tests/test_formatted_messages.py:
--------------------------------------------------------------------------------
```python
from textwrap import dedent
from openai_client.messages import format_with_liquid
def test_formatted_messages() -> None:
# Set instructions.
instructions = [
dedent("""
Generate an outline for the document, including title. The outline should include the key points that will be covered in the document. Consider the attachments, the rationale for why they were uploaded, and the conversation that has taken place. The outline should be a hierarchical structure with multiple levels of detail, and it should be clear and easy to understand. The outline should be generated in a way that is consistent with the document that will be generated from it.
""").strip(),
"<CHAT_HISTORY>{{chat_history}}</CHAT_HISTORY>",
"<ATTACHMENTS>{% for attachment in attachments %}<ATTACHMENT><FILENAME>{{attachment.filename}}</FILENAME><CONTENT>{{attachment.content}}</CONTENT></ATTACHMENT>{% endfor %}</ATTACHMENTS>",
"<EXISTING_OUTLINE>{{outline_versions.last}}</EXISTING_OUTLINE>",
"<USER_FEEDBACK>{{user_feedback}}</USER_FEEDBACK>",
]
# Set vars.
attachments = [
{"filename": "filename1", "content": "content1"},
{"filename": "filename2", "content": "content2"},
]
outline_versions = ["outline1", "outline2"]
user_feedback = "feedback"
chat_history = "history"
actual = [
format_with_liquid(
template=instruction,
vars={
"attachments": attachments,
"outline_versions": outline_versions,
"user_feedback": user_feedback,
"chat_history": chat_history,
},
)
for instruction in instructions
]
expected = [
"Generate an outline for the document, including title. The outline should include the key points that will be covered in the document. Consider the attachments, the rationale for why they were uploaded, and the conversation that has taken place. The outline should be a hierarchical structure with multiple levels of detail, and it should be clear and easy to understand. The outline should be generated in a way that is consistent with the document that will be generated from it.",
"<CHAT_HISTORY>history</CHAT_HISTORY>",
"<ATTACHMENTS><ATTACHMENT><FILENAME>filename1</FILENAME><CONTENT>content1</CONTENT></ATTACHMENT><ATTACHMENT><FILENAME>filename2</FILENAME><CONTENT>content2</CONTENT></ATTACHMENT></ATTACHMENTS>",
"<EXISTING_OUTLINE>outline2</EXISTING_OUTLINE>",
"<USER_FEEDBACK>feedback</USER_FEEDBACK>",
]
assert actual == expected
```
--------------------------------------------------------------------------------
/assistants/prospector-assistant/assistant/artifact_creation_extension/test/test_completion_with_tools.py:
--------------------------------------------------------------------------------
```python
import logging
from typing import Iterable
from unittest.mock import AsyncMock
from uuid import uuid4
import openai_client
import pytest
from assistant.artifact_creation_extension._llm import (
CompletionTool,
MessageResponse,
ToolCallResponse,
completion_with_tools,
)
from assistant.artifact_creation_extension.extension import LLMs
from openai.types.chat import ChatCompletionMessageParam
from pydantic import BaseModel
logger = logging.getLogger(__name__)
@pytest.mark.repeat(5)
async def test_completion_with_tools_error_handling(llms: LLMs):
class MockToolArgs(BaseModel):
arg1: str
mock_tool_function = AsyncMock()
mock_tool_function.__name__ = "mock_tool_function"
mock_tool_function.__doc__ = "The only tool you'll ever need"
success_message = "Success on the second call!" + uuid4().hex
# Simulate a tool that fails once before succeeding
mock_tool_function.side_effect = [
Exception("An error occurred on the first call"),
success_message,
]
tools = [
CompletionTool(
function=mock_tool_function,
argument_model=MockToolArgs,
)
]
async def head_messages() -> Iterable[ChatCompletionMessageParam]:
return [openai_client.create_system_message("Call the tool. Once it succeeds, let me know.")]
async def tail_messages() -> Iterable[ChatCompletionMessageParam]:
return []
# Call the function and collect responses
responses = []
async for response in completion_with_tools(
llm_config=llms.chat,
tools=tools,
head_messages=head_messages,
tail_messages=tail_messages,
):
logger.info("Response: %s", response)
responses.append(response)
assert responses, "Expected at least one response"
tool_responses = []
message_responses = []
for response in responses:
if isinstance(response, ToolCallResponse):
tool_responses.append(response)
continue
if isinstance(response, MessageResponse):
message_responses.append(response)
continue
pytest.fail(f"Unexpected response type: {type(response)}")
assert len(tool_responses) == 1, "Expected one tool response"
tool_response = tool_responses[0]
assert tool_response.tool_call.function.name == mock_tool_function.__name__
assert tool_response.result == success_message
assert len(message_responses) >= 1, "Expected at least one message response"
for message_response in message_responses:
logger.info("Message: %s", message_response.message)
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_email_headers/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are a cybersecurity and email expert.
Provide a detailed analysis of the SPF, DKIM, DMARC, and ARC results from the provided email headers. Analyze domain alignment for SPF and DKIM. Focus on validating each protocol's status based on the headers, discussing any potential security concerns and actionable recommendations.
# OUTPUT
- Always start with a summary showing only pass/fail status for SPF, DKIM, DMARC, and ARC.
- Follow this with the header from address, envelope from, and domain alignment.
- Follow this with detailed findings.
## OUTPUT EXAMPLE
# Email Header Analysis - (RFC 5322 From: address, NOT display name)
## SUMMARY
| Header | Disposition |
|--------|-------------|
| SPF | Pass/Fail |
| DKIM | Pass/Fail |
| DMARC | Pass/Fail |
| ARC | Pass/Fail/Not Present |
Header From: RFC 5322 address, NOT display name, NOT just the word address
Envelope From: RFC 5321 address, NOT display name, NOT just the word address
Domains Align: Pass/Fail
## DETAILS
### SPF (Sender Policy Framework)
### DKIM (DomainKeys Identified Mail)
### DMARC (Domain-based Message Authentication, Reporting, and Conformance)
### ARC (Authenticated Received Chain)
### Security Concerns and Recommendations
### Dig Commands
- Here is a bash script I use to check mx, spf, dkim (M365, Google, other common defaults), and dmarc records. Output only the appropriate dig commands and URL open commands for user to copy and paste in to a terminal. Set DOMAIN environment variable to email from domain first. Use the exact DKIM checks provided, do not abstract to just "default."
### check-dmarc.sh ###
#!/bin/bash
# checks mx, spf, dkim (M365, Google, other common defaults), and dmarc records
DOMAIN="${1}"
echo -e "\nMX record:\n"
dig +short mx $DOMAIN
echo -e "\nSPF record:\n"
dig +short txt $DOMAIN | grep -i "spf"
echo -e "\nDKIM keys (M365 default selectors):\n"
dig +short txt selector1._domainkey.$DOMAIN # m365 default selector
dig +short txt selector2._domainkey.$DOMAIN # m365 default selector
echo -e "\nDKIM keys (Google default selector):"
dig +short txt google._domainkey.$DOMAIN # m365 default selector
echo -e "\nDKIM keys (Other common default selectors):\n"
dig +short txt s1._domainkey.$DOMAIN
dig +short txt s2._domainkey.$DOMAIN
dig +short txt k1._domainkey.$DOMAIN
dig +short txt k2._domainkey.$DOMAIN
echo -e "\nDMARC policy:\n"
dig +short txt _dmarc.$DOMAIN
dig +short ns _dmarc.$DOMAIN
# these should open in the default browser
open "https://dmarcian.com/domain-checker/?domain=$DOMAIN"
open "https://domain-checker.valimail.com/dmarc/$DOMAIN"
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/assistant/domain/knowledge_brief_manager.py:
--------------------------------------------------------------------------------
```python
"""
Knowledge brief management operations for Knowledge Transfer Assistant.
Handles knowledge brief creation, updates, and retrieval.
"""
from typing import Optional
from semantic_workbench_assistant.assistant_app import ConversationContext
from ..data import InspectorTab, KnowledgeBrief, LogEntryType
from ..logging import logger
from ..notifications import Notifications
from ..storage import ShareStorage
from ..utils import require_current_user
from .share_manager import ShareManager
class KnowledgeBriefManager:
"""Manages knowledge brief operations."""
@staticmethod
async def get_knowledge_brief(context: ConversationContext) -> Optional[KnowledgeBrief]:
share_id = await ShareManager.get_share_id(context)
if not share_id:
return None
return ShareStorage.read_knowledge_brief(share_id)
@staticmethod
async def update_knowledge_brief(
context: ConversationContext,
title: str,
description: str,
timeline: Optional[str] = None,
) -> Optional[KnowledgeBrief]:
share_id = await ShareManager.get_share_id(context)
if not share_id:
logger.error("Cannot update brief: no share associated with this conversation")
return
current_user_id = await require_current_user(context, "update brief")
if not current_user_id:
return
brief = KnowledgeBrief(
title=title,
content=description,
timeline=timeline,
created_by=current_user_id,
updated_by=current_user_id,
conversation_id=str(context.id),
)
ShareStorage.write_knowledge_brief(share_id, brief)
# Check if this is a creation or an update
existing_brief = ShareStorage.read_knowledge_brief(share_id)
if existing_brief:
# This is an update
await ShareStorage.log_share_event(
context=context,
share_id=share_id,
entry_type=LogEntryType.BRIEFING_UPDATED.value,
message=f"Updated brief: {title}",
)
else:
# This is a creation
await ShareStorage.log_share_event(
context=context,
share_id=share_id,
entry_type=LogEntryType.BRIEFING_CREATED.value,
message=f"Created brief: {title}",
)
await Notifications.notify_all(context, share_id, "Knowledge brief has been updated")
await Notifications.notify_all_state_update(context, share_id, [InspectorTab.BRIEF])
return brief
```
--------------------------------------------------------------------------------
/libraries/python/openai-client/openai_client/errors.py:
--------------------------------------------------------------------------------
```python
from typing import Any
from openai import (
APIConnectionError,
APIStatusError,
BadRequestError,
RateLimitError,
)
from openai.types.chat import (
ParsedChatCompletion,
)
class CompletionInvalidError(Exception):
def __init__(self, message: str, body: dict[str, Any] | None = None) -> None:
self.message = message
self.body = body
super().__init__(self.message)
class CompletionIsNoneError(CompletionInvalidError):
def __init__(self) -> None:
super().__init__("The completion response is None.")
class CompletionRefusedError(CompletionInvalidError):
def __init__(self, refusal: str) -> None:
super().__init__(f"The model refused to complete the response: {refusal}", {"refusal": refusal})
class CompletionWithoutStopError(CompletionInvalidError):
def __init__(self, finish_reason: str) -> None:
super().__init__(f"The model did not complete the response: {finish_reason}", {"finish_reason": finish_reason})
class CompletionError(Exception):
def __init__(self, error: Exception) -> None:
if isinstance(error, APIConnectionError):
message = f"The server could not be reached: {error.__cause__}"
body = error.body
elif isinstance(error, RateLimitError):
message = "A 429 status code was received (rate limited); we should back off a bit."
body = error.body
elif isinstance(error, BadRequestError):
message = f"A 400 status code was received. {error.message}"
body = error.body
elif isinstance(error, APIStatusError):
message = f"Another non-200-range status code was received. {error.status_code}: {error.message}"
body = error.body
elif isinstance(error, CompletionInvalidError):
message = error.message
body = error.body
else:
message = f"An unknown error occurred ({error.__class__.__name__})."
body = str(error)
self.message = message
self.body = body
super().__init__(message)
def validate_completion(completion: ParsedChatCompletion | None) -> None:
if completion is None:
raise CompletionIsNoneError()
# Check for refusal.
refusal = completion.choices[0].message.refusal
if refusal:
raise CompletionRefusedError(refusal)
# Check "finish_reason" for "max_tokens" or "stop" to see if the response is incomplete.
finish_reason = completion.choices[0].finish_reason
if finish_reason not in ["stop", "tool_calls", None]:
raise CompletionWithoutStopError(finish_reason)
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_interviewer_techniques/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY
// Who you are
You are a hyper-intelligent AI system with a 4,312 IQ. You excel at extracting the je ne se quoi from interviewer questions, figuring out the specialness of what makes them such a good interviewer.
# GOAL
// What we are trying to achieve
1. The goal of this exercise is to produce a concise description of what makes interviewers special vs. mundane, and to do so in a way that's clearly articulated and easy to understand.
2. Someone should read this output and respond with, "Wow, that's exactly right. That IS what makes them a great interviewer!"
# 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
- Look at the full list of questions and look for the patterns in them. Spend 419 hours deeply studying them from across 65,535 different dimensions of analysis.
// Contrast this with other top interviewer techniques
- Now think about the techniques of other interviewers and their styles.
// Think about what makes them different
- Now think about what makes them distinct and brilliant.
# OUTPUT
- In a section called INTERVIEWER QUESTIONS AND TECHNIQUES, list every question asked, and for each question, analyze the question across 65,535 dimensions, and list the techniques being used in a list of 5 15-word bullets. Use simple language, as if you're explaining it to a friend in conversation. Do NOT omit any questions. Do them ALL.
- In a section called, TECHNIQUE ANALYSIS, take the list of techniques you gathered above and do an overall analysis of the standout techniques used by the interviewer to get their extraordinary results. Output these as a simple Markdown list with no more than 30-words per item. Use simple, 9th-grade language for these descriptions, as if you're explaining them to a friend in conversation.
- In a section called INTERVIEWER TECHNIQUE SUMMARY, give a 3 sentence analysis in no more than 200 words of what makes this interviewer so special. Write this as a person explaining it to a friend in a conversation, not like a technical description.
# OUTPUT INSTRUCTIONS
// What the output should look like:
- Do NOT omit any of the questions. Do the analysis on every single one of the questions you were given.
- Output only a Markdown list.
- Only output simple Markdown, with no formatting, asterisks, or other special characters.
- Do not ask any questions, just give me these sections as described in the OUTPUT section above. No matter what.
# INPUT
INPUT:
```
--------------------------------------------------------------------------------
/examples/dotnet/dotnet-02-message-types-demo/Program.cs:
--------------------------------------------------------------------------------
```csharp
// Copyright (c) Microsoft. All rights reserved.
using Azure;
using Azure.AI.ContentSafety;
using Azure.Identity;
using Microsoft.SemanticWorkbench.Connector;
namespace AgentExample;
internal static class Program
{
private const string CORSPolicyName = "MY-CORS";
internal static async Task Main(string[] args)
{
// Setup
WebApplicationBuilder appBuilder = WebApplication.CreateBuilder(args);
// Load settings from files and env vars
appBuilder.Configuration
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.Development.json", optional: true)
.AddJsonFile("appsettings.development.json", optional: true)
.AddEnvironmentVariables();
// Storage layer to persist agents configuration and conversations
appBuilder.Services.AddSingleton<IAgentServiceStorage, AgentServiceStorage>();
// Agent service to support multiple agent instances
appBuilder.Services.AddSingleton<WorkbenchConnector<MyAgentConfig>, MyWorkbenchConnector>();
// Azure AI Content Safety, used to monitor I/O
appBuilder.Services.AddAzureAIContentSafety(appBuilder.Configuration.GetSection("AzureContentSafety"));
// Misc
appBuilder.Services.AddLogging()
.AddCors(opt => opt.AddPolicy(CORSPolicyName, pol => pol.WithMethods("GET", "POST", "PUT", "DELETE")));
// Build
WebApplication app = appBuilder.Build();
app.UseCors(CORSPolicyName);
// Connect to workbench backend, keep alive, and accept incoming requests
var connectorApiPrefix = app.Configuration.GetSection("Workbench").Get<WorkbenchConfig>()!.ConnectorApiPrefix;
using var agentService = app.UseAgentWebservice<MyAgentConfig>(connectorApiPrefix, true);
await agentService.ConnectAsync().ConfigureAwait(false);
// Start app and webservice
await app.RunAsync().ConfigureAwait(false);
}
private static IServiceCollection AddAzureAIContentSafety(
this IServiceCollection services,
IConfiguration config)
{
var authType = config.GetValue<string>("AuthType");
var endpoint = new Uri(config.GetValue<string>("Endpoint")!) ?? throw new ArgumentException("Failed to set Azure AI Content Safety Endpoint");
var apiKey = config.GetValue<string>("ApiKey");
return services.AddSingleton<ContentSafetyClient>(_ => authType == "AzureIdentity"
? new ContentSafetyClient(endpoint, new DefaultAzureCredential())
: new ContentSafetyClient(endpoint, new AzureKeyCredential(apiKey!)));
}
}
```
--------------------------------------------------------------------------------
/assistants/project-assistant/assistant/text_includes/focus.md:
--------------------------------------------------------------------------------
```markdown
You are an AI assistant managing the focus of a task list related to a knowledge gathering process. You are not to add anything new to the task list, just help with organizing it.
The user creates consulting tasks about a lot of closely related things. Help the user by consolidating their tasks as appropriate.
- Sometimes the user has tasks that are contradictory. Help the user resolve these contradictions by proposing new tasks that resolve the conflicts.
- Sometimes the user may have tasks unrelated to their knowledge transfer consulting project. In such cases, remove those tasks entirely.
- Remove tasks that have already been completed.
### Conversation Flow
Help the user by reinforcing the approved knowledge transfer flow. The approved flow is:
```
Ensure that the knowledge package is complete and shared.
- If the knowledge share is missing key definition (audience, audience takeaways, required objectives/outcomes), help the client define these things.
- If the knowledge package is missing necessary content (chat messages, files, etc.), help the client add it.
- If the client has not defined learning objectives and outcomes or has NOT indicated they have no specific outcomes, ask if they want help defining them.
- If the intended audience takeaways (and learning objectives) are not able to be achieved with the current knowledge package, help the client collect more content to fill in gaps.
- If the knowledge package has no brief, help the client write one.
- If the package is ready for transfer, provide the invitation link and help the client craft an appropriate sharing message tailored to the audience.
An example consulting flow for a knowledge transfer project:
- Defined the intended audience takeaways.
- Define the audience.
- Define optional learning objectives and outcomes.
- Help the user add content to the knowledge package.
- Help run a gap analysis and help the user fill in gaps.
- Prepare the Knowledge brief.
- Help create an invitation.
This is a general flow. The consultant should adapt it based on the client's needs and the current state of the knowledge package.
```
### Post-Transfer Support
After the user/consultant is done helping their client with the knowledge sharing project, the user/consultant will continue to address any information requests from their clients but is also able to support updates to the audience definition, knowledge brief, objectives, outcomes, or knowledge package content at any time. Focus the user's task list for these purposes.
### Output
Given the set of tasks, return a new set of focused tasks. If the user has no tasks, return an empty list.
```
--------------------------------------------------------------------------------
/workbench-app/src/components/AssistantServiceRegistrations/AssistantServiceRegistrationRemove.tsx:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { DialogTrigger } from '@fluentui/react-components';
import { DeleteRegular } from '@fluentui/react-icons';
import React from 'react';
import { AssistantServiceRegistration } from '../../models/AssistantServiceRegistration';
import { useRemoveAssistantServiceRegistrationMutation } from '../../services/workbench';
import { CommandButton } from '../App/CommandButton';
interface AssistantServiceRegistrationRemoveProps {
assistantServiceRegistration: AssistantServiceRegistration;
onRemove?: () => void;
iconOnly?: boolean;
asToolbarButton?: boolean;
}
export const AssistantServiceRegistrationRemove: React.FC<AssistantServiceRegistrationRemoveProps> = (props) => {
const { assistantServiceRegistration, onRemove, iconOnly, asToolbarButton } = props;
const [removeAssistantServiceRegistration] = useRemoveAssistantServiceRegistrationMutation();
const [submitted, setSubmitted] = React.useState(false);
if (!assistantServiceRegistration) {
throw new Error(`Assistant service registration not found`);
}
const handleAssistantServiceRegistrationRemove = React.useCallback(async () => {
if (submitted) {
return;
}
setSubmitted(true);
try {
await removeAssistantServiceRegistration(assistantServiceRegistration.assistantServiceId);
onRemove?.();
} finally {
setSubmitted(false);
}
}, [assistantServiceRegistration.assistantServiceId, onRemove, removeAssistantServiceRegistration, submitted]);
return (
<CommandButton
icon={<DeleteRegular />}
iconOnly={iconOnly}
asToolbarButton={asToolbarButton}
description="Delete assistant service registration"
dialogContent={{
title: 'Delete Assistant Service Registration',
content: (
<p>
Are you sure you want to delete the assistant service registration{' '}
<strong>{assistantServiceRegistration.name}</strong>?
</p>
),
closeLabel: 'Cancel',
additionalActions: [
<DialogTrigger key="delete" disableButtonEnhancement>
<CommandButton
icon={<DeleteRegular />}
label="Delete"
onClick={handleAssistantServiceRegistrationRemove}
/>
</DialogTrigger>,
],
}}
/>
);
};
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/Canvas/AssistantCanvas.tsx:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { makeStyles, tokens } from '@fluentui/react-components';
import React from 'react';
import { Assistant } from '../../../models/Assistant';
import { useGetConversationStateDescriptionsQuery } from '../../../services/workbench';
import { ErrorMessageBar } from '../../App/ErrorMessageBar';
import { Loading } from '../../App/Loading';
import { AssistantInspectorList } from './AssistantInspectorList';
const useClasses = makeStyles({
inspectors: {
display: 'flex',
flexDirection: 'column',
backgroundColor: tokens.colorNeutralBackgroundAlpha,
height: '100%',
maxHeight: '100%',
overflowY: 'auto',
overflowX: 'hidden',
},
});
interface AssistantCanvasProps {
assistant: Assistant;
conversationId: string;
}
export const AssistantCanvas: React.FC<AssistantCanvasProps> = (props) => {
const { assistant, conversationId } = props;
const classes = useClasses();
const [stateDescriptionsErrorMessage, setStateDescriptionsErrorMessage] = React.useState<string>();
const {
data: stateDescriptions,
error: stateDescriptionsError,
isLoading: isLoadingStateDescriptions,
} = useGetConversationStateDescriptionsQuery({ assistantId: assistant.id, conversationId: conversationId });
React.useEffect(() => {
const errorMessage = stateDescriptionsError ? JSON.stringify(stateDescriptionsError) : undefined;
if (stateDescriptionsErrorMessage !== errorMessage) {
setStateDescriptionsErrorMessage(errorMessage);
}
}, [stateDescriptionsError, stateDescriptionsErrorMessage]);
// watching fetching instead of load, to avoid passing the old data on assistant id change
if (isLoadingStateDescriptions && !stateDescriptionsErrorMessage) {
return <Loading />;
}
const enabledStateDescriptions = stateDescriptions?.filter((stateDescription) => stateDescription.enabled) || [];
return (
<div className={classes.inspectors}>
{enabledStateDescriptions.length === 0 ? (
stateDescriptionsErrorMessage ? (
<ErrorMessageBar title="Failed to load assistant states" error={stateDescriptionsErrorMessage} />
) : (
<div>No states found for this assistant</div>
)
) : (
<AssistantInspectorList
conversationId={conversationId}
assistant={assistant}
stateDescriptions={enabledStateDescriptions}
/>
)}
</div>
);
};
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/Message/ContentRenderer.tsx:
--------------------------------------------------------------------------------
```typescript
import { SystemMessage } from '@fluentui-copilot/react-copilot';
import {
AlertUrgent24Regular,
KeyCommandRegular,
Note24Regular,
TextBulletListSquareSparkleRegular,
} from '@fluentui/react-icons';
import React from 'react';
import { Conversation } from '../../../models/Conversation';
import { ConversationMessage } from '../../../models/ConversationMessage';
import { AssistantCard } from '../../FrontDoor/Controls/AssistantCard';
import { MessageContent } from './MessageContent';
interface ContentRendererProps {
conversation: Conversation;
message: ConversationMessage;
}
export const ContentRenderer: React.FC<ContentRendererProps> = (props) => {
const { conversation, message } = props;
const appComponent = message.metadata?._appComponent;
if (appComponent) {
switch (appComponent.type) {
case 'AssistantCard':
return (
<AssistantCard
assistantServiceId={appComponent.props.assistantServiceId}
templateId={appComponent.props.templateId}
existingConversationId={appComponent.props.existingConversationId}
participantMetadata={appComponent.props.participantMetadata}
hideContent
/>
);
default:
return null;
}
}
const messageContent = <MessageContent message={message} conversation={conversation} />;
const renderedContent =
message.messageType === 'notice' ||
message.messageType === 'note' ||
message.messageType === 'command' ||
message.messageType === 'command-response' ? (
<NoticeRenderer content={messageContent} messageType={message.messageType} />
) : (
messageContent
);
return renderedContent;
};
interface MessageRendererProps {
content: JSX.Element;
messageType: string;
}
const NoticeRenderer: React.FC<MessageRendererProps> = (props) => {
const { content, messageType } = props;
let icon = null;
switch (messageType) {
case 'notice':
icon = <AlertUrgent24Regular />;
break;
case 'note':
icon = <Note24Regular />;
break;
case 'command':
icon = <KeyCommandRegular />;
break;
case 'command-response':
icon = <TextBulletListSquareSparkleRegular />;
break;
default:
break;
}
return (
<SystemMessage icon={icon} message={content}>
{content}
</SystemMessage>
);
};
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/research/routines/web_research.py:
--------------------------------------------------------------------------------
```python
"""
web research skill
"""
import json
from typing import Any
from skill_library import AskUserFn, EmitFn, RunContext, RunRoutineFn
async def main(
context: RunContext,
routine_state: dict[str, Any],
emit: EmitFn,
run: RunRoutineFn,
ask_user: AskUserFn,
plan_name: str,
topic: str,
) -> str:
"""Research a topic thoroughly and return a report."""
plan = await run("research.generate_research_plan", topic)
await run("posix.write_file", f"{plan_name}.txt", json.dumps(plan, indent=2))
user_intent = "update"
while user_intent == "update":
await ask_user("Does this plan look ok? If not, how would you like me to change it?")
user_intent = await run(
"common.select_user_intent",
{
"confirm": "The user is happy with the plan and wants to execute it.",
"update": "The user wants to change some things about the plan.",
"exit": "The user wants to stop the research.",
},
)
if user_intent == "update":
plan = json.loads(await run("posix.read_file", f"{plan_name}.txt"))
plan = await run("research.update_research_plan", topic, plan)
await run("posix.write_file", f"{plan_name}.txt", json.dumps(plan, indent=2))
if user_intent == "exit":
print("Exiting research.")
await run("posix.delete_file", f"{plan_name}.txt")
return ""
plan = json.loads(await run("posix.read_file", f"{plan_name}.txt"))
research_answers_filename = f"{plan_name}_research_answers.md"
await run("posix.write_file", research_answers_filename, f"# Research on {topic}\n\n")
for question in plan:
is_good_answer = False
query = question
previous_searches = []
while not is_good_answer:
related_web_content = await run(
"research.web_search", search_description=query, previous_searches=previous_searches
)
answer = await run("research.answer_question_about_content", related_web_content, question)
is_good_answer, reasoning = await run("research.evaluate_answer", question, answer)
if is_good_answer:
await run("posix.append_file", research_answers_filename, f"## {question}\n\n{answer}\n\n")
else:
previous_searches.append((query, reasoning))
answers = await run("posix.read_file", research_answers_filename)
conclusion = await run("common.summarize", answers, topic)
await run("posix.append_file", research_answers_filename, f"## Conclusion\n\n{conclusion}\n\n")
return conclusion
```
--------------------------------------------------------------------------------
/workbench-app/src/libs/useNotify.tsx:
--------------------------------------------------------------------------------
```typescript
import {
Slot,
Toast,
ToastBody,
ToastFooter,
ToastIntent,
ToastTitle,
ToastTrigger,
useToastController,
} from '@fluentui/react-components';
import React from 'react';
import { Constants } from '../Constants';
interface NotifyOptions {
id: string;
title?: string;
message: string;
subtitle?: string;
action?: Slot<'div'> | string;
additionalActions?: React.ReactElement[];
timeout?: number;
intent: ToastIntent;
}
export const useNotify = (toasterId: string = Constants.app.globalToasterId) => {
const { dispatchToast } = useToastController(toasterId);
const notify = React.useCallback(
(options: NotifyOptions) => {
const { id, title, message, subtitle, action, additionalActions, timeout, intent } = options;
const getAction = () => {
if (typeof action === 'string') {
return (
<ToastTrigger>
<span>{action}</span>
</ToastTrigger>
);
}
return action;
};
dispatchToast(
<Toast>
<ToastTitle action={getAction()}>{title}</ToastTitle>
<ToastBody subtitle={subtitle}>{message}</ToastBody>
{additionalActions && <ToastFooter>{additionalActions}</ToastFooter>}
</Toast>,
{
toastId: id,
timeout,
intent,
},
);
},
[dispatchToast],
);
const notifySuccess = React.useCallback(
(options: Omit<NotifyOptions, 'intent'>) =>
notify({
...options,
intent: 'success',
}),
[notify],
);
const notifyInfo = React.useCallback(
(options: Omit<NotifyOptions, 'intent'>) =>
notify({
...options,
intent: 'info',
}),
[notify],
);
const notifyWarning = React.useCallback(
(options: Omit<NotifyOptions, 'intent'>) =>
notify({
...options,
intent: 'warning',
}),
[notify],
);
const notifyError = React.useCallback(
(options: Omit<NotifyOptions, 'intent'>) =>
notify({
action: 'Dismiss',
timeout: -1,
...options,
intent: 'error',
}),
[notify],
);
return { notify, notifySuccess, notifyInfo, notifyError, notifyWarning };
};
```
--------------------------------------------------------------------------------
/workbench-service/pyproject.toml:
--------------------------------------------------------------------------------
```toml
[project]
name = "semantic-workbench-service"
version = "0.1.0"
description = "Library for facilitating the implementation of FastAPI-based Semantic Workbench essistants."
authors = [{ name = "Semantic Workbench Team" }]
readme = "README.md"
requires-python = ">=3.11,<3.13"
dependencies = [
"aiosqlite~=0.20.0",
"alembic~=1.13.1",
"asgi-correlation-id>=4.3.1",
"asyncpg~=0.29.0",
"azure-cognitiveservices-speech>=1.41.1",
"azure-core[aio]>=1.30.0",
"azure-identity>=1.16.0",
"azure-keyvault-secrets>=4.8.0",
"cachetools>=5.3.3",
"deepmerge>=2.0",
"fastapi[standard]~=0.115.0",
"greenlet~=3.0.3",
"jsonschema>=4.20.0",
"openai-client>=0.1.0",
"pydantic-settings>=2.2.0",
"python-dotenv>=1.0.0",
"python-jose[cryptography]>=3.3.0",
"python-json-logger>=2.0.7",
"rich>=13.7.0",
"semantic-workbench-api-model>=0.1.0",
"sqlmodel~=0.0.14",
"sse-starlette>=1.8.2",
]
[dependency-groups]
dev = [
"asgi-lifespan>=2.1.0",
"pyright>=1.1.389",
"pytest>=7.4.3",
"pytest-asyncio>=0.23.5.post1",
"pytest-docker>=3.1.1",
"pytest-httpx>=0.30.0",
# semantic-workbench-assistant is used for integration tests
"semantic-workbench-assistant>=0.1.0",
]
[tool.uv.sources]
openai-client = { path = "../libraries/python/openai-client", editable = true }
semantic-workbench-api-model = { path = "../libraries/python/semantic-workbench-api-model", editable = true }
semantic-workbench-assistant = { path = "../libraries/python/semantic-workbench-assistant", editable = true }
[project.scripts]
start-semantic-workbench-service = "semantic_workbench_service.start:main"
start-service = "semantic_workbench_service.start:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.pytest.ini_options]
addopts = "-vv"
log_cli = true
log_cli_level = "WARNING"
log_cli_format = "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s"
testpaths = ["tests"]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
# fail tests on warnings that aren't explicitly ignored
filterwarnings = [
"error",
# stream warnings are from bugs in starlette - hopefully they fix this
"ignore: Unclosed .MemoryObject(Send|Receive)Stream.:ResourceWarning",
# aiosqlite doesn't handle cancelations correctly
"ignore: Exception in thread Thread:pytest.PytestUnhandledThreadExceptionWarning",
# asyncpg sometimes fails to close sockets/transports/connections
"ignore: unclosed <socket.socket:ResourceWarning",
"ignore: unclosed transport:ResourceWarning",
"ignore: unclosed connection <asyncpg.connection:ResourceWarning",
]
```
--------------------------------------------------------------------------------
/workbench-service/semantic_workbench_service/controller/user.py:
--------------------------------------------------------------------------------
```python
from typing import AsyncContextManager, Callable
from semantic_workbench_api_model import workbench_model
from sqlmodel import col, select
from sqlmodel.ext.asyncio.session import AsyncSession
from .. import auth, db
from . import convert
async def add_or_update_user_from(
session: AsyncSession,
user_principal: auth.UserPrincipal,
) -> None:
is_service_user = isinstance(user_principal, auth.ServiceUserPrincipal)
inserted = await db.insert_if_not_exists(
session, db.User(user_id=user_principal.user_id, name=user_principal.name, service_user=is_service_user)
)
if inserted:
return await session.commit()
user = (
await session.exec(select(db.User).where(db.User.user_id == user_principal.user_id).with_for_update())
).one()
user.name = user_principal.name
user.service_user = isinstance(user_principal, auth.ServiceUserPrincipal)
session.add(user)
await session.commit()
class UserController:
def __init__(
self,
get_session: Callable[[], AsyncContextManager[AsyncSession]],
) -> None:
self._get_session = get_session
async def update_user(
self,
user_principal: auth.UserPrincipal,
user_id: str,
update_user: workbench_model.UpdateUser,
) -> workbench_model.User:
async with self._get_session() as session:
inserted = await db.insert_if_not_exists(
session, db.User(user_id=user_id, name=update_user.name or user_principal.name, image=update_user.image)
)
user = (await session.exec(select(db.User).where(db.User.user_id == user_id).with_for_update())).one()
if not inserted:
updates = update_user.model_dump(exclude_unset=True)
for field, value in updates.items():
setattr(user, field, value)
session.add(user)
await session.commit()
return convert.user_from_db(model=user)
async def get_users(self, user_ids: list[str]) -> workbench_model.UserList:
async with self._get_session() as session:
users = (await session.exec(select(db.User).where(col(db.User.user_id).in_(user_ids)))).all()
return convert.user_list_from_db(models=users)
async def get_user_me(self, user_principal: auth.UserPrincipal) -> workbench_model.User:
async with self._get_session() as session:
await add_or_update_user_from(session, user_principal=user_principal)
user = (await session.exec(select(db.User).where(db.User.user_id == user_principal.user_id))).one()
return convert.user_from_db(model=user)
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_report_finding/system.md:
--------------------------------------------------------------------------------
```markdown
# IDENTITY and PURPOSE
You are a extremely experienced 'jack-of-all-trades' cyber security consultant that is diligent, concise but informative and professional. You are highly experienced in web, API, infrastructure (on-premise and cloud), and mobile testing. Additionally, you are an expert in threat modeling and analysis.
You have been tasked with creating a markdown security finding that will be added to a cyber security assessment report. It must have the following sections: Description, Risk, Recommendations, References, One-Sentence-Summary, Trends, Quotes.
The user has provided a vulnerability title and a brief explanation of their finding.
Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
# STEPS
- Create a Title section that contains the title of the finding.
- Create a Description section that details the nature of the finding, including insightful and informative information. Do not use bullet point lists for this section.
- Create a Risk section that details the risk of the finding. Do not solely use bullet point lists for this section.
- Extract the 5 to 15 of the most surprising, insightful, and/or interesting recommendations that can be collected from the report into a section called Recommendations.
- Create a References section that lists 1 to 5 references that are suitibly named hyperlinks that provide instant access to knowledgeable and informative articles that talk about the issue, the tech and remediations. Do not hallucinate or act confident if you are unsure.
- Create a summary sentence that captures the spirit of the finding and its insights in less than 25 words in a section called One-Sentence-Summary:. Use plain and conversational language when creating this summary. Don't use jargon or marketing language.
- Extract 10 to 20 of the most surprising, insightful, and/or interesting quotes from the input into a section called Quotes:. Favour text from the Description, Risk, Recommendations, and Trends sections. Use the exact quote text from the input.
# OUTPUT INSTRUCTIONS
- Only output Markdown.
- Do not output the markdown code syntax, only the content.
- Do not use bold or italics formatting in the markdown output.
- Extract at least 5 TRENDS from the content.
- Extract at least 10 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:
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/chat_driver_helpers.py:
--------------------------------------------------------------------------------
```python
import functools
import inspect
from typing import Callable
from .types import ActionFn, RunContextProvider
class ChatDriverFunctions:
"""
Functions used for chat drivers (tool functions) can be created from skill
actions functions by removing their run_context parameter and making the
run_context available through a RunContextProvider. Additionally, we need to
remove any default values for all parameters as OpenAI doesn't allow default
parameters in their tool functions.
Initialize this class with a run context provider and a list of action
functions and it will generate wrapper methods for each action that can be
used in a chat driver.
This is helpful for maing chat driver setup in a skill simpler.
"""
def __init__(self, actions: list[ActionFn], run_context_provider: RunContextProvider) -> None:
self.actions = {action.__name__: action for action in actions}
self.run_context_provider = run_context_provider
self._generate_wrappers()
def _generate_wrappers(self) -> None:
"""
Dynamically create wrapper methods for all actions.
"""
for name, action in self.actions.items():
# Throw an error if the action does not have a run_context parameter.
if "run_context" not in inspect.signature(action).parameters:
raise ValueError(f"Invalid action function. '{name}' must have a 'run_context' parameter.")
# Remove default values from the parameters
original_signature = inspect.signature(action)
parameters = [
param.replace(default=inspect.Parameter.empty) for param in original_signature.parameters.values()
]
parameters = [param for param in parameters if param.name != "run_context"]
new_signature = original_signature.replace(parameters=parameters)
def make_wrapper(action):
@functools.wraps(action)
def wrapper(*args, **kwargs):
run_context = self.run_context_provider.create_run_context()
return action(run_context, *args, **kwargs)
# Update the wrapper function's signature to match the modified signature
wrapper.__signature__ = new_signature # type: ignore
return wrapper
# Set the wrapper as an attribute of the instance.
setattr(self, name, make_wrapper(action))
def all(self) -> list[Callable]:
"""
Return a list of all dynamically created wrapper methods.
"""
return [getattr(self, name) for name in self.actions.keys()]
```
--------------------------------------------------------------------------------
/tools/makefiles/docker.mk:
--------------------------------------------------------------------------------
```
DOCKER_REGISTRY_NAME ?=
ifneq ($(DOCKER_REGISTRY_NAME),)
DOCKER_REGISTRY_HOST ?= $(DOCKER_REGISTRY_NAME).azurecr.io
endif
DOCKER_IMAGE_TAG ?= $(shell git rev-parse HEAD)
DOCKER_PUSH_LATEST ?= true
DOCKER_PATH ?= .
DOCKER_FILE ?= Dockerfile
DOCKER_BUILD_ARGS ?=
AZURE_WEBSITE_NAME ?=
AZURE_WEBSITE_SLOT ?= staging
AZURE_WEBSITE_TARGET_SLOT ?= production
AZURE_WEBSITE_SUBSCRIPTION ?=
AZURE_WEBSITE_RESOURCE_GROUP ?=
require_value = $(foreach var,$(1),$(if $(strip $($(var))),,$(error "Variable $(var) is not set: $($(var))")))
.PHONY: .docker-build
.docker-build:
$(call require_value,DOCKER_IMAGE_NAME DOCKER_IMAGE_TAG DOCKER_FILE DOCKER_PATH)
ifdef DOCKER_BUILD_ARGS
docker build -t $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) $(foreach arg,$(DOCKER_BUILD_ARGS),--build-arg $(arg)) $(DOCKER_PATH) -f $(DOCKER_FILE)
else
docker build -t $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) $(DOCKER_PATH) -f $(DOCKER_FILE)
endif
.PHONY: .docker-push
.docker-push: .docker-build
$(call require_value,DOCKER_REGISTRY_NAME DOCKER_REGISTRY_HOST DOCKER_IMAGE_NAME DOCKER_IMAGE_TAG)
az acr login --name $(DOCKER_REGISTRY_NAME)
docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) $(DOCKER_REGISTRY_HOST)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
docker push $(DOCKER_REGISTRY_HOST)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
ifeq ($(DOCKER_PUSH_LATEST),true)
docker tag $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) $(DOCKER_REGISTRY_HOST)/$(DOCKER_IMAGE_NAME)
docker push $(DOCKER_REGISTRY_HOST)/$(DOCKER_IMAGE_NAME)
endif
define update-container
az webapp config container set \
--subscription $(AZURE_WEBSITE_SUBSCRIPTION) \
--resource-group $(AZURE_WEBSITE_RESOURCE_GROUP) \
--name $(1) --slot $(AZURE_WEBSITE_SLOT) \
--container-image-name $(DOCKER_REGISTRY_HOST)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
endef
define swap-slots
az webapp deployment slot swap \
--subscription $(AZURE_WEBSITE_SUBSCRIPTION) \
--resource-group $(AZURE_WEBSITE_RESOURCE_GROUP) \
--name $(1) \
--slot $(AZURE_WEBSITE_SLOT) \
--target-slot $(AZURE_WEBSITE_TARGET_SLOT) \
--verbose
endef
.PHONY: .azure-container-deploy
.azure-container-deploy:
$(call require_value,AZURE_WEBSITE_SUBSCRIPTION AZURE_WEBSITE_NAME AZURE_WEBSITE_SLOT AZURE_WEBSITE_RESOURCE_GROUP DOCKER_REGISTRY_HOST DOCKER_IMAGE_NAME DOCKER_IMAGE_TAG)
$(foreach website_name,$(AZURE_WEBSITE_NAME),$(call update-container,$(website_name)))
ifneq ($(AZURE_WEBSITE_SLOT),$(AZURE_WEBSITE_TARGET_SLOT))
$(foreach website_name,$(AZURE_WEBSITE_NAME),$(call swap-slots,$(website_name)))
endif
ifndef DISABLE_DEFAULT_DOCKER_TARGETS
docker-build: .docker-build
docker-push: .docker-push
docker-deploy: .azure-container-deploy
endif
```
--------------------------------------------------------------------------------
/workbench-app/src/components/App/DialogControl.tsx:
--------------------------------------------------------------------------------
```typescript
import {
Button,
Dialog,
DialogActions,
DialogBody,
DialogContent,
DialogOpenChangeData,
DialogOpenChangeEvent,
DialogSurface,
DialogTitle,
DialogTrigger,
makeStyles,
mergeClasses,
tokens,
} from '@fluentui/react-components';
import React from 'react';
const useClasses = makeStyles({
dialogContent: {
display: 'flex',
flexDirection: 'column',
gap: tokens.spacingVerticalM,
},
});
export interface DialogControlContent {
open?: boolean;
defaultOpen?: boolean;
trigger?: React.ReactElement;
classNames?: {
dialogSurface?: string;
dialogContent?: string;
};
title?: string;
content?: React.ReactNode;
closeLabel?: string;
hideDismissButton?: boolean;
dismissButtonDisabled?: boolean;
additionalActions?: React.ReactElement[];
onOpenChange?: (event: DialogOpenChangeEvent, data: DialogOpenChangeData) => void;
}
export const DialogControl: React.FC<DialogControlContent> = (props) => {
const {
open,
defaultOpen,
trigger,
classNames,
title,
content,
closeLabel,
dismissButtonDisabled,
hideDismissButton,
additionalActions,
onOpenChange,
} = props;
const classes = useClasses();
return (
<Dialog open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange} inertTrapFocus={true}>
<DialogTrigger disableButtonEnhancement>{trigger}</DialogTrigger>
<DialogSurface className={classNames?.dialogSurface}>
<DialogBody>
{title && <DialogTitle>{title}</DialogTitle>}
{content && (
<DialogContent className={mergeClasses(classes.dialogContent, classNames?.dialogContent)}>
{content}
</DialogContent>
)}
<DialogActions fluid>
{!hideDismissButton && (
<DialogTrigger disableButtonEnhancement action="close">
<Button
appearance={additionalActions ? 'secondary' : 'primary'}
disabled={dismissButtonDisabled}
>
{closeLabel ?? 'Close'}
</Button>
</DialogTrigger>
)}
{additionalActions}
</DialogActions>
</DialogBody>
</DialogSurface>
</Dialog>
);
};
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/research/routines/generate_research_plan.py:
--------------------------------------------------------------------------------
```python
from typing import Any, cast
from openai_client import (
CompletionError,
create_system_message,
create_user_message,
extra_data,
make_completion_args_serializable,
validate_completion,
)
from pydantic import BaseModel
from skill_library import AskUserFn, EmitFn, RunContext, RunRoutineFn
from skill_library.logging import logger
from skill_library.skills.common import CommonSkill
async def main(
context: RunContext, routine_state: dict[str, Any], emit: EmitFn, run: RunRoutineFn, ask_user: AskUserFn, topic: str
) -> list[str]:
"""
Generate a research plan on a given topic. The plan will consist of a set of
research questions to be answered.
"""
common_skill = cast(CommonSkill, context.skills["common"])
language_model = common_skill.config.language_model
class Output(BaseModel):
reasoning: str
research_questions: list[str]
completion_args = {
"model": "gpt-4o",
"messages": [
create_system_message(
"You are an expert research assistant. For any given topic, carefully analyze it to identify core, tangential, and nuanced areas requiring exploration. Approach the topic methodically, breaking it down into its fundamental aspects, associated themes, and interconnections. Thoroughly think through the subject step by step and aim to create a comprehensive set of research questions.",
),
create_user_message(
f"Topic: {topic}",
),
],
"response_format": Output,
}
logger.debug("Completion call.", extra=extra_data(make_completion_args_serializable(completion_args)))
metadata = {}
metadata["completion_args"] = make_completion_args_serializable(completion_args)
try:
completion = await language_model.beta.chat.completions.parse(
**completion_args,
)
validate_completion(completion)
logger.debug("Completion response.", extra=extra_data({"completion": completion.model_dump()}))
metadata["completion"] = completion.model_dump()
except Exception as e:
completion_error = CompletionError(e)
metadata["completion_error"] = completion_error.message
logger.error(
completion_error.message,
extra=extra_data({"completion_error": completion_error.body}),
)
raise completion_error from e
else:
research_questions = cast(Output, completion.choices[0].message.parsed).research_questions
metadata["research_questions"] = research_questions
return research_questions
finally:
context.log("generate_research_plan", metadata)
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/Canvas/ConversationCanvas.tsx:
--------------------------------------------------------------------------------
```typescript
// Copyright (c) Microsoft. All rights reserved.
import { Card, Text, makeStyles, tokens } from '@fluentui/react-components';
import React from 'react';
import { Conversation } from '../../../models/Conversation';
import { ConversationFile } from '../../../models/ConversationFile';
import { ConversationParticipant } from '../../../models/ConversationParticipant';
import { ContextWindow } from '../ContextWindow';
import { ConversationTranscript } from '../ConversationTranscript';
import { FileList } from '../FileList';
import { ParticipantList } from '../ParticipantList';
const useClasses = makeStyles({
root: {
display: 'flex',
flexDirection: 'column',
gap: tokens.spacingHorizontalM,
width: '100%',
},
card: {
overflow: 'visible',
},
});
interface ConversationCanvasProps {
conversation: Conversation;
conversationParticipants: ConversationParticipant[];
conversationFiles: ConversationFile[];
preventAssistantModifyOnParticipantIds?: string[];
readOnly: boolean;
}
export const ConversationCanvas: React.FC<ConversationCanvasProps> = (props) => {
const {
conversationParticipants,
conversationFiles,
conversation,
preventAssistantModifyOnParticipantIds,
readOnly,
} = props;
const classes = useClasses();
return (
<div className={classes.root}>
<Card className={classes.card}>
<Text size={400} weight="semibold">
Participants
</Text>
<ParticipantList
conversation={conversation}
participants={conversationParticipants}
preventAssistantModifyOnParticipantIds={preventAssistantModifyOnParticipantIds}
readOnly={readOnly}
/>
</Card>
<Card className={classes.card}>
<Text size={400} weight="semibold">
Transcript
</Text>
<ConversationTranscript conversation={conversation} participants={conversationParticipants} />
</Card>
<Card className={classes.card}>
<Text size={400} weight="semibold">
Context window
</Text>
<ContextWindow conversation={conversation} />
</Card>
<Card className={classes.card}>
<Text size={400} weight="semibold">
Files
</Text>
<FileList readOnly={readOnly} conversation={conversation} conversationFiles={conversationFiles} />
</Card>
</div>
);
};
```