This is page 14 of 145. Use http://codebase.md/microsoft/semanticworkbench?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .devcontainer
│ ├── .vscode
│ │ └── settings.json
│ ├── devcontainer.json
│ ├── OPTIMIZING_FOR_CODESPACES.md
│ ├── POST_SETUP_README.md
│ └── README.md
├── .dockerignore
├── .gitattributes
├── .github
│ ├── policheck.yml
│ └── workflows
│ ├── assistants-codespace-assistant.yml
│ ├── assistants-document-assistant.yml
│ ├── assistants-explorer-assistant.yml
│ ├── assistants-guided-conversation-assistant.yml
│ ├── assistants-knowledge-transfer-assistant.yml
│ ├── assistants-navigator-assistant.yml
│ ├── assistants-project-assistant.yml
│ ├── assistants-prospector-assistant.yml
│ ├── assistants-skill-assistant.yml
│ ├── libraries.yml
│ ├── mcp-server-giphy.yml
│ ├── mcp-server-memory-filesystem-edit.yml
│ ├── mcp-server-memory-user-bio.yml
│ ├── mcp-server-memory-whiteboard.yml
│ ├── mcp-server-open-deep-research-clone.yml
│ ├── mcp-server-web-research.yml
│ ├── workbench-app.yml
│ └── workbench-service.yml
├── .gitignore
├── .multi-root-tools
│ ├── Makefile
│ └── README.md
├── .vscode
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── ai_context
│ └── generated
│ ├── ASPIRE_ORCHESTRATOR.md
│ ├── ASSISTANT_CODESPACE.md
│ ├── ASSISTANT_DOCUMENT.md
│ ├── ASSISTANT_NAVIGATOR.md
│ ├── ASSISTANT_PROJECT.md
│ ├── ASSISTANT_PROSPECTOR.md
│ ├── ASSISTANTS_OTHER.md
│ ├── ASSISTANTS_OVERVIEW.md
│ ├── CONFIGURATION.md
│ ├── DOTNET_LIBRARIES.md
│ ├── EXAMPLES.md
│ ├── MCP_SERVERS.md
│ ├── PYTHON_LIBRARIES_AI_CLIENTS.md
│ ├── PYTHON_LIBRARIES_CORE.md
│ ├── PYTHON_LIBRARIES_EXTENSIONS.md
│ ├── PYTHON_LIBRARIES_SKILLS.md
│ ├── PYTHON_LIBRARIES_SPECIALIZED.md
│ ├── TOOLS.md
│ ├── WORKBENCH_FRONTEND.md
│ └── WORKBENCH_SERVICE.md
├── aspire-orchestrator
│ ├── .editorconfig
│ ├── Aspire.AppHost
│ │ ├── .gitignore
│ │ ├── appsettings.json
│ │ ├── Aspire.AppHost.csproj
│ │ ├── Program.cs
│ │ └── Properties
│ │ └── launchSettings.json
│ ├── Aspire.Extensions
│ │ ├── Aspire.Extensions.csproj
│ │ ├── Dashboard.cs
│ │ ├── DockerFileExtensions.cs
│ │ ├── PathNormalizer.cs
│ │ ├── UvAppHostingExtensions.cs
│ │ ├── UvAppResource.cs
│ │ ├── VirtualEnvironment.cs
│ │ └── WorkbenchServiceHostingExtensions.cs
│ ├── Aspire.ServiceDefaults
│ │ ├── Aspire.ServiceDefaults.csproj
│ │ └── Extensions.cs
│ ├── README.md
│ ├── run.sh
│ ├── SemanticWorkbench.Aspire.sln
│ └── SemanticWorkbench.Aspire.sln.DotSettings
├── assistants
│ ├── codespace-assistant
│ │ ├── .claude
│ │ │ └── settings.local.json
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── extensions.json
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── assets
│ │ │ │ ├── icon_context_transfer.svg
│ │ │ │ └── icon.svg
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ ├── helpers.py
│ │ │ ├── response
│ │ │ │ ├── __init__.py
│ │ │ │ ├── completion_handler.py
│ │ │ │ ├── models.py
│ │ │ │ ├── request_builder.py
│ │ │ │ ├── response.py
│ │ │ │ ├── step_handler.py
│ │ │ │ └── utils
│ │ │ │ ├── __init__.py
│ │ │ │ ├── abbreviations.py
│ │ │ │ ├── formatting_utils.py
│ │ │ │ ├── message_utils.py
│ │ │ │ └── openai_utils.py
│ │ │ ├── text_includes
│ │ │ │ ├── card_content_context_transfer.md
│ │ │ │ ├── card_content.md
│ │ │ │ ├── codespace_assistant_info.md
│ │ │ │ ├── context_transfer_assistant_info.md
│ │ │ │ ├── guardrails_prompt.txt
│ │ │ │ ├── guidance_prompt_context_transfer.txt
│ │ │ │ ├── guidance_prompt.txt
│ │ │ │ ├── instruction_prompt_context_transfer.txt
│ │ │ │ └── instruction_prompt.txt
│ │ │ └── whiteboard
│ │ │ ├── __init__.py
│ │ │ ├── _inspector.py
│ │ │ └── _whiteboard.py
│ │ ├── assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── document-assistant
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── assets
│ │ │ │ └── icon.svg
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ ├── context_management
│ │ │ │ ├── __init__.py
│ │ │ │ └── inspector.py
│ │ │ ├── filesystem
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _convert.py
│ │ │ │ ├── _file_sources.py
│ │ │ │ ├── _filesystem.py
│ │ │ │ ├── _inspector.py
│ │ │ │ ├── _model.py
│ │ │ │ ├── _prompts.py
│ │ │ │ └── _tasks.py
│ │ │ ├── guidance
│ │ │ │ ├── __init__.py
│ │ │ │ ├── dynamic_ui_inspector.py
│ │ │ │ ├── guidance_config.py
│ │ │ │ ├── guidance_prompts.py
│ │ │ │ └── README.md
│ │ │ ├── response
│ │ │ │ ├── __init__.py
│ │ │ │ ├── completion_handler.py
│ │ │ │ ├── models.py
│ │ │ │ ├── prompts.py
│ │ │ │ ├── responder.py
│ │ │ │ └── utils
│ │ │ │ ├── __init__.py
│ │ │ │ ├── formatting_utils.py
│ │ │ │ ├── message_utils.py
│ │ │ │ ├── openai_utils.py
│ │ │ │ ├── tokens_tiktoken.py
│ │ │ │ └── workbench_messages.py
│ │ │ ├── text_includes
│ │ │ │ └── document_assistant_info.md
│ │ │ ├── types.py
│ │ │ └── whiteboard
│ │ │ ├── __init__.py
│ │ │ ├── _inspector.py
│ │ │ └── _whiteboard.py
│ │ ├── assistant.code-workspace
│ │ ├── CLAUDE.md
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ ├── __init__.py
│ │ │ ├── test_convert.py
│ │ │ └── test_data
│ │ │ ├── blank_image.png
│ │ │ ├── Formatting Test.docx
│ │ │ ├── sample_data.csv
│ │ │ ├── sample_data.xlsx
│ │ │ ├── sample_page.html
│ │ │ ├── sample_presentation.pptx
│ │ │ └── simple_pdf.pdf
│ │ └── uv.lock
│ ├── explorer-assistant
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ ├── helpers.py
│ │ │ ├── response
│ │ │ │ ├── __init__.py
│ │ │ │ ├── model.py
│ │ │ │ ├── response_anthropic.py
│ │ │ │ ├── response_openai.py
│ │ │ │ └── response.py
│ │ │ └── text_includes
│ │ │ └── guardrails_prompt.txt
│ │ ├── assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── guided-conversation-assistant
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── agents
│ │ │ │ ├── guided_conversation
│ │ │ │ │ ├── config.py
│ │ │ │ │ ├── definition.py
│ │ │ │ │ └── definitions
│ │ │ │ │ ├── er_triage.py
│ │ │ │ │ ├── interview.py
│ │ │ │ │ ├── patient_intake.py
│ │ │ │ │ └── poem_feedback.py
│ │ │ │ └── guided_conversation_agent.py
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ └── text_includes
│ │ │ └── guardrails_prompt.txt
│ │ ├── assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── knowledge-transfer-assistant
│ │ ├── .claude
│ │ │ └── settings.local.json
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── agentic
│ │ │ │ ├── __init__.py
│ │ │ │ ├── analysis.py
│ │ │ │ ├── coordinator_support.py
│ │ │ │ └── team_welcome.py
│ │ │ ├── assets
│ │ │ │ ├── icon-knowledge-transfer.svg
│ │ │ │ └── icon.svg
│ │ │ ├── assistant.py
│ │ │ ├── common.py
│ │ │ ├── config.py
│ │ │ ├── conversation_clients.py
│ │ │ ├── conversation_share_link.py
│ │ │ ├── data.py
│ │ │ ├── domain
│ │ │ │ ├── __init__.py
│ │ │ │ ├── audience_manager.py
│ │ │ │ ├── information_request_manager.py
│ │ │ │ ├── knowledge_brief_manager.py
│ │ │ │ ├── knowledge_digest_manager.py
│ │ │ │ ├── learning_objectives_manager.py
│ │ │ │ └── share_manager.py
│ │ │ ├── files.py
│ │ │ ├── logging.py
│ │ │ ├── notifications.py
│ │ │ ├── respond.py
│ │ │ ├── storage_models.py
│ │ │ ├── storage.py
│ │ │ ├── string_utils.py
│ │ │ ├── text_includes
│ │ │ │ ├── assistant_info.md
│ │ │ │ ├── card_content.md
│ │ │ │ ├── coordinator_instructions.txt
│ │ │ │ ├── coordinator_role.txt
│ │ │ │ ├── knowledge_digest_instructions.txt
│ │ │ │ ├── knowledge_digest_prompt.txt
│ │ │ │ ├── share_information_request_detection.txt
│ │ │ │ ├── team_instructions.txt
│ │ │ │ ├── team_role.txt
│ │ │ │ └── welcome_message_generation.txt
│ │ │ ├── tools
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── information_requests.py
│ │ │ │ ├── learning_objectives.py
│ │ │ │ ├── learning_outcomes.py
│ │ │ │ ├── progress_tracking.py
│ │ │ │ └── share_setup.py
│ │ │ ├── ui_tabs
│ │ │ │ ├── __init__.py
│ │ │ │ ├── brief.py
│ │ │ │ ├── common.py
│ │ │ │ ├── debug.py
│ │ │ │ ├── learning.py
│ │ │ │ └── sharing.py
│ │ │ └── utils.py
│ │ ├── CLAUDE.md
│ │ ├── docs
│ │ │ ├── design
│ │ │ │ ├── actions.md
│ │ │ │ └── inference.md
│ │ │ ├── DEV_GUIDE.md
│ │ │ ├── how-kta-works.md
│ │ │ ├── JTBD.md
│ │ │ ├── knowledge-transfer-goals.md
│ │ │ ├── learning_assistance.md
│ │ │ ├── notable_claude_conversations
│ │ │ │ ├── clarifying_quad_modal_design.md
│ │ │ │ ├── CLAUDE_PROMPTS.md
│ │ │ │ ├── transfer_state.md
│ │ │ │ └── trying_the_context_agent.md
│ │ │ └── opportunities-of-knowledge-transfer.md
│ │ ├── knowledge-transfer-assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ ├── __init__.py
│ │ │ ├── test_artifact_loading.py
│ │ │ ├── test_inspector.py
│ │ │ ├── test_share_manager.py
│ │ │ ├── test_share_storage.py
│ │ │ ├── test_share_tools.py
│ │ │ └── test_team_mode.py
│ │ └── uv.lock
│ ├── Makefile
│ ├── navigator-assistant
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── assets
│ │ │ │ ├── card_content.md
│ │ │ │ └── icon.svg
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ ├── helpers.py
│ │ │ ├── response
│ │ │ │ ├── __init__.py
│ │ │ │ ├── completion_handler.py
│ │ │ │ ├── completion_requestor.py
│ │ │ │ ├── local_tool
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── add_assistant_to_conversation.py
│ │ │ │ │ ├── list_assistant_services.py
│ │ │ │ │ └── model.py
│ │ │ │ ├── models.py
│ │ │ │ ├── prompt.py
│ │ │ │ ├── request_builder.py
│ │ │ │ ├── response.py
│ │ │ │ ├── step_handler.py
│ │ │ │ └── utils
│ │ │ │ ├── __init__.py
│ │ │ │ ├── formatting_utils.py
│ │ │ │ ├── message_utils.py
│ │ │ │ ├── openai_utils.py
│ │ │ │ └── tools.py
│ │ │ ├── text_includes
│ │ │ │ ├── guardrails_prompt.md
│ │ │ │ ├── guidance_prompt.md
│ │ │ │ ├── instruction_prompt.md
│ │ │ │ ├── navigator_assistant_info.md
│ │ │ │ └── semantic_workbench_features.md
│ │ │ └── whiteboard
│ │ │ ├── __init__.py
│ │ │ ├── _inspector.py
│ │ │ └── _whiteboard.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── project-assistant
│ │ ├── .cspell
│ │ │ └── custom-dictionary-workspace.txt
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── agentic
│ │ │ │ ├── __init__.py
│ │ │ │ ├── act.py
│ │ │ │ ├── coordinator_next_action.py
│ │ │ │ ├── create_invitation.py
│ │ │ │ ├── detect_audience_and_takeaways.py
│ │ │ │ ├── detect_coordinator_actions.py
│ │ │ │ ├── detect_information_request_needs.py
│ │ │ │ ├── detect_knowledge_package_gaps.py
│ │ │ │ ├── focus.py
│ │ │ │ ├── respond.py
│ │ │ │ ├── team_welcome.py
│ │ │ │ └── update_digest.py
│ │ │ ├── assets
│ │ │ │ ├── icon-knowledge-transfer.svg
│ │ │ │ └── icon.svg
│ │ │ ├── assistant.py
│ │ │ ├── common.py
│ │ │ ├── config.py
│ │ │ ├── conversation_clients.py
│ │ │ ├── data.py
│ │ │ ├── domain
│ │ │ │ ├── __init__.py
│ │ │ │ ├── audience_manager.py
│ │ │ │ ├── conversation_preferences_manager.py
│ │ │ │ ├── information_request_manager.py
│ │ │ │ ├── knowledge_brief_manager.py
│ │ │ │ ├── knowledge_digest_manager.py
│ │ │ │ ├── learning_objectives_manager.py
│ │ │ │ ├── share_manager.py
│ │ │ │ ├── tasks_manager.py
│ │ │ │ └── transfer_manager.py
│ │ │ ├── errors.py
│ │ │ ├── files.py
│ │ │ ├── logging.py
│ │ │ ├── notifications.py
│ │ │ ├── prompt_utils.py
│ │ │ ├── storage.py
│ │ │ ├── string_utils.py
│ │ │ ├── text_includes
│ │ │ │ ├── actor_instructions.md
│ │ │ │ ├── assistant_info.md
│ │ │ │ ├── card_content.md
│ │ │ │ ├── coordinator_instructions copy.md
│ │ │ │ ├── coordinator_instructions.md
│ │ │ │ ├── create_invitation.md
│ │ │ │ ├── detect_audience.md
│ │ │ │ ├── detect_coordinator_actions.md
│ │ │ │ ├── detect_information_request_needs.md
│ │ │ │ ├── detect_knowledge_package_gaps.md
│ │ │ │ ├── focus.md
│ │ │ │ ├── knowledge_digest_instructions.txt
│ │ │ │ ├── team_instructions.txt
│ │ │ │ ├── to_do.md
│ │ │ │ ├── update_knowledge_brief.md
│ │ │ │ ├── update_knowledge_digest.md
│ │ │ │ └── welcome_message_generation.txt
│ │ │ ├── tools
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── conversation_preferences.py
│ │ │ │ ├── information_requests.py
│ │ │ │ ├── learning_objectives.py
│ │ │ │ ├── learning_outcomes.py
│ │ │ │ ├── progress_tracking.py
│ │ │ │ ├── share_setup.py
│ │ │ │ ├── system_reminders.py
│ │ │ │ ├── tasks.py
│ │ │ │ └── todo.py
│ │ │ ├── ui_tabs
│ │ │ │ ├── __init__.py
│ │ │ │ ├── brief.py
│ │ │ │ ├── common.py
│ │ │ │ ├── debug.py
│ │ │ │ ├── learning.py
│ │ │ │ └── sharing.py
│ │ │ └── utils.py
│ │ ├── CLAUDE.md
│ │ ├── docs
│ │ │ ├── design
│ │ │ │ ├── actions.md
│ │ │ │ ├── control_options.md
│ │ │ │ ├── design.md
│ │ │ │ ├── inference.md
│ │ │ │ └── PXL_20250814_190140267.jpg
│ │ │ ├── DEV_GUIDE.md
│ │ │ ├── how-kta-works.md
│ │ │ ├── JTBD.md
│ │ │ ├── knowledge-transfer-goals.md
│ │ │ ├── learning_assistance.md
│ │ │ ├── notable_claude_conversations
│ │ │ │ ├── clarifying_quad_modal_design.md
│ │ │ │ ├── CLAUDE_PROMPTS.md
│ │ │ │ ├── transfer_state.md
│ │ │ │ └── trying_the_context_agent.md
│ │ │ └── opportunities-of-knowledge-transfer.md
│ │ ├── knowledge-transfer-assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ ├── __init__.py
│ │ │ ├── test_artifact_loading.py
│ │ │ ├── test_inspector.py
│ │ │ ├── test_share_manager.py
│ │ │ ├── test_share_storage.py
│ │ │ └── test_team_mode.py
│ │ └── uv.lock
│ ├── prospector-assistant
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── agents
│ │ │ │ ├── artifact_agent.py
│ │ │ │ ├── document
│ │ │ │ │ ├── config.py
│ │ │ │ │ ├── gc_draft_content_feedback_config.py
│ │ │ │ │ ├── gc_draft_outline_feedback_config.py
│ │ │ │ │ ├── guided_conversation.py
│ │ │ │ │ └── state.py
│ │ │ │ └── document_agent.py
│ │ │ ├── artifact_creation_extension
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _llm.py
│ │ │ │ ├── config.py
│ │ │ │ ├── document.py
│ │ │ │ ├── extension.py
│ │ │ │ ├── store.py
│ │ │ │ ├── test
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── evaluation.py
│ │ │ │ │ ├── test_completion_with_tools.py
│ │ │ │ │ └── test_extension.py
│ │ │ │ └── tools.py
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ ├── form_fill_extension
│ │ │ │ ├── __init__.py
│ │ │ │ ├── config.py
│ │ │ │ ├── extension.py
│ │ │ │ ├── inspector.py
│ │ │ │ ├── state.py
│ │ │ │ └── steps
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _guided_conversation.py
│ │ │ │ ├── _llm.py
│ │ │ │ ├── acquire_form_step.py
│ │ │ │ ├── extract_form_fields_step.py
│ │ │ │ ├── fill_form_step.py
│ │ │ │ └── types.py
│ │ │ ├── helpers.py
│ │ │ ├── legacy.py
│ │ │ └── text_includes
│ │ │ ├── artifact_agent_enabled.md
│ │ │ ├── guardrails_prompt.txt
│ │ │ ├── guided_conversation_agent_enabled.md
│ │ │ └── skills_agent_enabled.md
│ │ ├── assistant.code-workspace
│ │ ├── gc_learnings
│ │ │ ├── gc_learnings.md
│ │ │ └── images
│ │ │ ├── gc_conversation_plan_fcn.png
│ │ │ ├── gc_conversation_plan_template.png
│ │ │ ├── gc_execute_plan_callstack.png
│ │ │ ├── gc_functions.png
│ │ │ ├── gc_generate_plan_callstack.png
│ │ │ ├── gc_get_resource_instructions.png
│ │ │ ├── gc_get_termination_instructions.png
│ │ │ ├── gc_kernel_arguments.png
│ │ │ ├── gc_plan_calls.png
│ │ │ ├── gc_termination_instructions.png
│ │ │ ├── sk_get_chat_message_contents.png
│ │ │ ├── sk_inner_get_chat_message_contents.png
│ │ │ ├── sk_send_request_prep.png
│ │ │ └── sk_send_request.png
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ └── skill-assistant
│ ├── .env.example
│ ├── .vscode
│ │ ├── launch.json
│ │ └── settings.json
│ ├── assistant
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── logging.py
│ │ ├── skill_assistant.py
│ │ ├── skill_engine_registry.py
│ │ ├── skill_event_mapper.py
│ │ ├── text_includes
│ │ │ └── guardrails_prompt.txt
│ │ └── workbench_helpers.py
│ ├── assistant.code-workspace
│ ├── Makefile
│ ├── pyproject.toml
│ ├── README.md
│ ├── tests
│ │ └── test_setup.py
│ └── uv.lock
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── docs
│ ├── .vscode
│ │ └── settings.json
│ ├── ASSISTANT_CONFIG.md
│ ├── ASSISTANT_DEVELOPMENT_GUIDE.md
│ ├── CUSTOM_APP_REGISTRATION.md
│ ├── HOSTED_ASSISTANT_WITH_LOCAL_MCP_SERVERS.md
│ ├── images
│ │ ├── architecture-animation.gif
│ │ ├── configure_assistant.png
│ │ ├── conversation_canvas_open.png
│ │ ├── conversation_duplicate.png
│ │ ├── conversation_export.png
│ │ ├── conversation_share_dialog.png
│ │ ├── conversation_share_link.png
│ │ ├── dashboard_configured_view.png
│ │ ├── dashboard_view.png
│ │ ├── license_agreement.png
│ │ ├── message_bar.png
│ │ ├── message_inspection.png
│ │ ├── message_link.png
│ │ ├── new_prospector_assistant_dialog.png
│ │ ├── open_conversation_canvas.png
│ │ ├── prospector_example.png
│ │ ├── readme1.png
│ │ ├── readme2.png
│ │ ├── readme3.png
│ │ ├── rewind.png
│ │ ├── signin_page.png
│ │ └── splash_screen.png
│ ├── LOCAL_ASSISTANT_WITH_REMOTE_WORKBENCH.md
│ ├── SETUP_DEV_ENVIRONMENT.md
│ └── WORKBENCH_APP.md
├── examples
│ ├── dotnet
│ │ ├── .editorconfig
│ │ ├── dotnet-01-echo-bot
│ │ │ ├── appsettings.json
│ │ │ ├── dotnet-01-echo-bot.csproj
│ │ │ ├── MyAgent.cs
│ │ │ ├── MyAgentConfig.cs
│ │ │ ├── MyWorkbenchConnector.cs
│ │ │ ├── Program.cs
│ │ │ └── README.md
│ │ ├── dotnet-02-message-types-demo
│ │ │ ├── appsettings.json
│ │ │ ├── ConnectorExtensions.cs
│ │ │ ├── docs
│ │ │ │ ├── abc.png
│ │ │ │ ├── code.png
│ │ │ │ ├── config.png
│ │ │ │ ├── echo.png
│ │ │ │ ├── markdown.png
│ │ │ │ ├── mermaid.png
│ │ │ │ ├── reverse.png
│ │ │ │ └── safety-check.png
│ │ │ ├── dotnet-02-message-types-demo.csproj
│ │ │ ├── MyAgent.cs
│ │ │ ├── MyAgentConfig.cs
│ │ │ ├── MyWorkbenchConnector.cs
│ │ │ ├── Program.cs
│ │ │ └── README.md
│ │ └── dotnet-03-simple-chatbot
│ │ ├── appsettings.json
│ │ ├── ConnectorExtensions.cs
│ │ ├── dotnet-03-simple-chatbot.csproj
│ │ ├── MyAgent.cs
│ │ ├── MyAgentConfig.cs
│ │ ├── MyWorkbenchConnector.cs
│ │ ├── Program.cs
│ │ └── README.md
│ ├── Makefile
│ └── python
│ ├── python-01-echo-bot
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── chat.py
│ │ │ └── config.py
│ │ ├── assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── python-02-simple-chatbot
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant
│ │ │ ├── __init__.py
│ │ │ ├── chat.py
│ │ │ ├── config.py
│ │ │ └── text_includes
│ │ │ └── guardrails_prompt.txt
│ │ ├── assistant.code-workspace
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ └── python-03-multimodel-chatbot
│ ├── .env.example
│ ├── .vscode
│ │ ├── launch.json
│ │ └── settings.json
│ ├── assistant
│ │ ├── __init__.py
│ │ ├── chat.py
│ │ ├── config.py
│ │ ├── model_adapters.py
│ │ └── text_includes
│ │ └── guardrails_prompt.txt
│ ├── assistant.code-workspace
│ ├── Makefile
│ ├── pyproject.toml
│ ├── README.md
│ └── uv.lock
├── KNOWN_ISSUES.md
├── libraries
│ ├── dotnet
│ │ ├── .editorconfig
│ │ ├── pack.sh
│ │ ├── README.md
│ │ ├── SemanticWorkbench.sln
│ │ ├── SemanticWorkbench.sln.DotSettings
│ │ └── WorkbenchConnector
│ │ ├── AgentBase.cs
│ │ ├── AgentConfig
│ │ │ ├── AgentConfigBase.cs
│ │ │ ├── AgentConfigPropertyAttribute.cs
│ │ │ └── ConfigUtils.cs
│ │ ├── Constants.cs
│ │ ├── IAgentBase.cs
│ │ ├── icon.png
│ │ ├── Models
│ │ │ ├── Command.cs
│ │ │ ├── Conversation.cs
│ │ │ ├── ConversationEvent.cs
│ │ │ ├── DebugInfo.cs
│ │ │ ├── Insight.cs
│ │ │ ├── Message.cs
│ │ │ ├── MessageMetadata.cs
│ │ │ ├── Participant.cs
│ │ │ ├── Sender.cs
│ │ │ └── ServiceInfo.cs
│ │ ├── Storage
│ │ │ ├── AgentInfo.cs
│ │ │ ├── AgentServiceStorage.cs
│ │ │ └── IAgentServiceStorage.cs
│ │ ├── StringLoggingExtensions.cs
│ │ ├── Webservice.cs
│ │ ├── WorkbenchConfig.cs
│ │ ├── WorkbenchConnector.cs
│ │ └── WorkbenchConnector.csproj
│ ├── Makefile
│ └── python
│ ├── anthropic-client
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── anthropic_client
│ │ │ ├── __init__.py
│ │ │ ├── client.py
│ │ │ ├── config.py
│ │ │ └── messages.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── assistant-data-gen
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── assistant_data_gen
│ │ │ ├── __init__.py
│ │ │ ├── assistant_api.py
│ │ │ ├── config.py
│ │ │ ├── gce
│ │ │ │ ├── __init__.py
│ │ │ │ ├── gce_agent.py
│ │ │ │ └── prompts.py
│ │ │ └── pydantic_ai_utils.py
│ │ ├── configs
│ │ │ └── document_assistant_example_config.yaml
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── scripts
│ │ │ ├── gce_simulation.py
│ │ │ └── generate_scenario.py
│ │ └── uv.lock
│ ├── assistant-drive
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── extensions.json
│ │ │ └── settings.json
│ │ ├── assistant_drive
│ │ │ ├── __init__.py
│ │ │ ├── drive.py
│ │ │ └── tests
│ │ │ └── test_basic.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── pytest.ini
│ │ ├── README.md
│ │ ├── usage.ipynb
│ │ └── uv.lock
│ ├── assistant-extensions
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── assistant_extensions
│ │ │ ├── __init__.py
│ │ │ ├── ai_clients
│ │ │ │ └── config.py
│ │ │ ├── artifacts
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _artifacts.py
│ │ │ │ ├── _inspector.py
│ │ │ │ └── _model.py
│ │ │ ├── attachments
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _attachments.py
│ │ │ │ ├── _convert.py
│ │ │ │ ├── _model.py
│ │ │ │ ├── _shared.py
│ │ │ │ └── _summarizer.py
│ │ │ ├── chat_context_toolkit
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _config.py
│ │ │ │ ├── archive
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── _archive.py
│ │ │ │ │ └── _summarizer.py
│ │ │ │ ├── message_history
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── _history.py
│ │ │ │ │ └── _message.py
│ │ │ │ └── virtual_filesystem
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _archive_file_source.py
│ │ │ │ └── _attachments_file_source.py
│ │ │ ├── dashboard_card
│ │ │ │ ├── __init__.py
│ │ │ │ └── _dashboard_card.py
│ │ │ ├── document_editor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _extension.py
│ │ │ │ ├── _inspector.py
│ │ │ │ └── _model.py
│ │ │ ├── mcp
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _assistant_file_resource_handler.py
│ │ │ │ ├── _client_utils.py
│ │ │ │ ├── _devtunnel.py
│ │ │ │ ├── _model.py
│ │ │ │ ├── _openai_utils.py
│ │ │ │ ├── _sampling_handler.py
│ │ │ │ ├── _tool_utils.py
│ │ │ │ └── _workbench_file_resource_handler.py
│ │ │ ├── navigator
│ │ │ │ ├── __init__.py
│ │ │ │ └── _navigator.py
│ │ │ └── workflows
│ │ │ ├── __init__.py
│ │ │ ├── _model.py
│ │ │ ├── _workflows.py
│ │ │ └── runners
│ │ │ └── _user_proxy.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── test
│ │ │ └── attachments
│ │ │ └── test_attachments.py
│ │ └── uv.lock
│ ├── chat-context-toolkit
│ │ ├── .claude
│ │ │ └── settings.local.json
│ │ ├── .env.sample
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── assets
│ │ │ ├── archive_v1.png
│ │ │ ├── history_v1.png
│ │ │ └── vfs_v1.png
│ │ ├── chat_context_toolkit
│ │ │ ├── __init__.py
│ │ │ ├── archive
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _archive_reader.py
│ │ │ │ ├── _archive_task_queue.py
│ │ │ │ ├── _state.py
│ │ │ │ ├── _types.py
│ │ │ │ └── summarization
│ │ │ │ ├── __init__.py
│ │ │ │ └── _summarizer.py
│ │ │ ├── history
│ │ │ │ ├── __init__.py
│ │ │ │ ├── _budget.py
│ │ │ │ ├── _decorators.py
│ │ │ │ ├── _history.py
│ │ │ │ ├── _prioritize.py
│ │ │ │ ├── _types.py
│ │ │ │ └── tool_abbreviations
│ │ │ │ ├── __init__.py
│ │ │ │ └── _tool_abbreviations.py
│ │ │ └── virtual_filesystem
│ │ │ ├── __init__.py
│ │ │ ├── _types.py
│ │ │ ├── _virtual_filesystem.py
│ │ │ ├── README.md
│ │ │ └── tools
│ │ │ ├── __init__.py
│ │ │ ├── _ls_tool.py
│ │ │ ├── _tools.py
│ │ │ └── _view_tool.py
│ │ ├── CLAUDE.md
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── test
│ │ │ ├── archive
│ │ │ │ └── test_archive_reader.py
│ │ │ ├── history
│ │ │ │ ├── test_abbreviate_messages.py
│ │ │ │ ├── test_history.py
│ │ │ │ ├── test_pair_and_order_tool_messages.py
│ │ │ │ ├── test_prioritize.py
│ │ │ │ └── test_truncate_messages.py
│ │ │ └── virtual_filesystem
│ │ │ ├── test_virtual_filesystem.py
│ │ │ └── tools
│ │ │ ├── test_ls_tool.py
│ │ │ ├── test_tools.py
│ │ │ └── test_view_tool.py
│ │ └── uv.lock
│ ├── content-safety
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── content_safety
│ │ │ ├── __init__.py
│ │ │ ├── evaluators
│ │ │ │ ├── __init__.py
│ │ │ │ ├── azure_content_safety
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── config.py
│ │ │ │ │ └── evaluator.py
│ │ │ │ ├── config.py
│ │ │ │ ├── evaluator.py
│ │ │ │ └── openai_moderations
│ │ │ │ ├── __init__.py
│ │ │ │ ├── config.py
│ │ │ │ └── evaluator.py
│ │ │ └── README.md
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── events
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── events
│ │ │ ├── __init__.py
│ │ │ └── events.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── guided-conversation
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── guided_conversation
│ │ │ ├── __init__.py
│ │ │ ├── functions
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conversation_plan.py
│ │ │ │ ├── execution.py
│ │ │ │ └── final_update_plan.py
│ │ │ ├── guided_conversation_agent.py
│ │ │ ├── plugins
│ │ │ │ ├── __init__.py
│ │ │ │ ├── agenda.py
│ │ │ │ └── artifact.py
│ │ │ └── utils
│ │ │ ├── __init__.py
│ │ │ ├── base_model_llm.py
│ │ │ ├── conversation_helpers.py
│ │ │ ├── openai_tool_calling.py
│ │ │ ├── plugin_helpers.py
│ │ │ └── resources.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── llm-client
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── llm_client
│ │ │ ├── __init__.py
│ │ │ └── model.py
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── Makefile
│ ├── mcp-extensions
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_extensions
│ │ │ ├── __init__.py
│ │ │ ├── _client_session.py
│ │ │ ├── _model.py
│ │ │ ├── _sampling.py
│ │ │ ├── _server_extensions.py
│ │ │ ├── _tool_utils.py
│ │ │ ├── llm
│ │ │ │ ├── __init__.py
│ │ │ │ ├── chat_completion.py
│ │ │ │ ├── helpers.py
│ │ │ │ ├── llm_types.py
│ │ │ │ ├── mcp_chat_completion.py
│ │ │ │ └── openai_chat_completion.py
│ │ │ └── server
│ │ │ ├── __init__.py
│ │ │ └── storage.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ └── test_tool_utils.py
│ │ └── uv.lock
│ ├── mcp-tunnel
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_tunnel
│ │ │ ├── __init__.py
│ │ │ ├── _devtunnel.py
│ │ │ ├── _dir.py
│ │ │ └── _main.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── openai-client
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── openai_client
│ │ │ ├── __init__.py
│ │ │ ├── chat_driver
│ │ │ │ ├── __init__.py
│ │ │ │ ├── chat_driver.ipynb
│ │ │ │ ├── chat_driver.py
│ │ │ │ ├── message_history_providers
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── in_memory_message_history_provider.py
│ │ │ │ │ ├── local_message_history_provider.py
│ │ │ │ │ ├── message_history_provider.py
│ │ │ │ │ └── tests
│ │ │ │ │ └── formatted_instructions_test.py
│ │ │ │ └── README.md
│ │ │ ├── client.py
│ │ │ ├── completion.py
│ │ │ ├── config.py
│ │ │ ├── errors.py
│ │ │ ├── logging.py
│ │ │ ├── messages.py
│ │ │ ├── tokens.py
│ │ │ └── tools.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ ├── test_command_parsing.py
│ │ │ ├── test_formatted_messages.py
│ │ │ ├── test_messages.py
│ │ │ └── test_tokens.py
│ │ └── uv.lock
│ ├── semantic-workbench-api-model
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── semantic_workbench_api_model
│ │ │ ├── __init__.py
│ │ │ ├── assistant_model.py
│ │ │ ├── assistant_service_client.py
│ │ │ ├── workbench_model.py
│ │ │ └── workbench_service_client.py
│ │ └── uv.lock
│ ├── semantic-workbench-assistant
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── semantic_workbench_assistant
│ │ │ ├── __init__.py
│ │ │ ├── assistant_app
│ │ │ │ ├── __init__.py
│ │ │ │ ├── assistant.py
│ │ │ │ ├── config.py
│ │ │ │ ├── content_safety.py
│ │ │ │ ├── context.py
│ │ │ │ ├── error.py
│ │ │ │ ├── export_import.py
│ │ │ │ ├── protocol.py
│ │ │ │ └── service.py
│ │ │ ├── assistant_service.py
│ │ │ ├── auth.py
│ │ │ ├── canonical.py
│ │ │ ├── command.py
│ │ │ ├── config.py
│ │ │ ├── logging_config.py
│ │ │ ├── settings.py
│ │ │ ├── start.py
│ │ │ └── storage.py
│ │ ├── tests
│ │ │ ├── conftest.py
│ │ │ ├── test_assistant_app.py
│ │ │ ├── test_canonical.py
│ │ │ ├── test_config.py
│ │ │ └── test_storage.py
│ │ └── uv.lock
│ └── skills
│ ├── .vscode
│ │ └── settings.json
│ ├── Makefile
│ ├── README.md
│ └── skill-library
│ ├── .vscode
│ │ └── settings.json
│ ├── docs
│ │ └── vs-recipe-tool.md
│ ├── Makefile
│ ├── pyproject.toml
│ ├── README.md
│ ├── skill_library
│ │ ├── __init__.py
│ │ ├── chat_driver_helpers.py
│ │ ├── cli
│ │ │ ├── azure_openai.py
│ │ │ ├── conversation_history.py
│ │ │ ├── README.md
│ │ │ ├── run_routine.py
│ │ │ ├── settings.py
│ │ │ └── skill_logger.py
│ │ ├── engine.py
│ │ ├── llm_info.txt
│ │ ├── logging.py
│ │ ├── README.md
│ │ ├── routine_stack.py
│ │ ├── skill.py
│ │ ├── skills
│ │ │ ├── common
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common_skill.py
│ │ │ │ └── routines
│ │ │ │ ├── bing_search.py
│ │ │ │ ├── consolidate.py
│ │ │ │ ├── echo.py
│ │ │ │ ├── gather_context.py
│ │ │ │ ├── get_content_from_url.py
│ │ │ │ ├── gpt_complete.py
│ │ │ │ ├── select_user_intent.py
│ │ │ │ └── summarize.py
│ │ │ ├── eval
│ │ │ │ ├── __init__.py
│ │ │ │ ├── eval_skill.py
│ │ │ │ └── routines
│ │ │ │ └── eval.py
│ │ │ ├── fabric
│ │ │ │ ├── __init__.py
│ │ │ │ ├── fabric_skill.py
│ │ │ │ ├── patterns
│ │ │ │ │ ├── agility_story
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── ai
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_answers
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_candidates
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_cfp_submission
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_claims
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_comments
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_debate
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_email_headers
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_incident
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_interviewer_techniques
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_logs
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_malware
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_military_strategy
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_mistakes
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_paper
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_patent
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_personality
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_presentation
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_product_feedback
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_proposition
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_prose
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_prose_json
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_prose_pinker
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_risk
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_sales_call
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_spiritual_text
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_tech_impact
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_threat_report
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── analyze_threat_report_cmds
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── analyze_threat_report_trends
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── answer_interview_question
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── ask_secure_by_design_questions
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── ask_uncle_duke
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── capture_thinkers_work
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── check_agreement
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── clean_text
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── coding_master
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── compare_and_contrast
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── convert_to_markdown
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_5_sentence_summary
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_academic_paper
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_ai_jobs_analysis
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_aphorisms
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_art_prompt
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_better_frame
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_coding_project
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_command
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_cyber_summary
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_design_document
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_diy
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_formal_email
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_git_diff_commit
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_graph_from_input
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_hormozi_offer
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_idea_compass
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_investigation_visualization
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_keynote
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_logo
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_markmap_visualization
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_mermaid_visualization
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_mermaid_visualization_for_github
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_micro_summary
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_network_threat_landscape
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_newsletter_entry
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_npc
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_pattern
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_prd
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_prediction_block
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_quiz
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_reading_plan
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_recursive_outline
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_report_finding
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_rpg_summary
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_security_update
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_show_intro
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_sigma_rules
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_story_explanation
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_stride_threat_model
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_summary
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_tags
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_threat_scenarios
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_ttrc_graph
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_ttrc_narrative
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_upgrade_pack
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_user_story
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── create_video_chapters
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── create_visualization
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── dialog_with_socrates
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── enrich_blog_post
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── explain_code
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── explain_docs
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── explain_math
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── explain_project
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── explain_terms
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── export_data_as_csv
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_algorithm_update_recommendations
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── extract_article_wisdom
│ │ │ │ │ │ ├── dmiessler
│ │ │ │ │ │ │ └── extract_wisdom-1.0.0
│ │ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ │ └── user.md
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── extract_book_ideas
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_book_recommendations
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_business_ideas
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_controversial_ideas
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_core_message
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_ctf_writeup
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_domains
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_extraordinary_claims
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_ideas
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_insights
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_insights_dm
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_instructions
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_jokes
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_latest_video
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_main_idea
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_most_redeeming_thing
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_patterns
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_poc
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── extract_predictions
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_primary_problem
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_primary_solution
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_product_features
│ │ │ │ │ │ ├── dmiessler
│ │ │ │ │ │ │ └── extract_wisdom-1.0.0
│ │ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ │ └── user.md
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_questions
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_recipe
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_recommendations
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── extract_references
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── extract_skills
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_song_meaning
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_sponsors
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_videoid
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── extract_wisdom
│ │ │ │ │ │ ├── dmiessler
│ │ │ │ │ │ │ └── extract_wisdom-1.0.0
│ │ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ │ └── user.md
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_wisdom_agents
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_wisdom_dm
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── extract_wisdom_nometa
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── find_hidden_message
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── find_logical_fallacies
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── get_wow_per_minute
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── get_youtube_rss
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── humanize
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── identify_dsrp_distinctions
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── identify_dsrp_perspectives
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── identify_dsrp_relationships
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── identify_dsrp_systems
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── identify_job_stories
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── improve_academic_writing
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── improve_prompt
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── improve_report_finding
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── improve_writing
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── judge_output
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── label_and_rate
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── loaded
│ │ │ │ │ ├── md_callout
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── official_pattern_template
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── pattern_explanations.md
│ │ │ │ │ ├── prepare_7s_strategy
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── provide_guidance
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── rate_ai_response
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── rate_ai_result
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── rate_content
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── rate_value
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── raw_query
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── raycast
│ │ │ │ │ │ ├── capture_thinkers_work
│ │ │ │ │ │ ├── create_story_explanation
│ │ │ │ │ │ ├── extract_primary_problem
│ │ │ │ │ │ ├── extract_wisdom
│ │ │ │ │ │ └── yt
│ │ │ │ │ ├── recommend_artists
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── recommend_pipeline_upgrades
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── recommend_talkpanel_topics
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── refine_design_document
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── review_design
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── sanitize_broken_html_to_markdown
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── show_fabric_options_markmap
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── solve_with_cot
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── stringify
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── suggest_pattern
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── summarize
│ │ │ │ │ │ ├── dmiessler
│ │ │ │ │ │ │ └── summarize
│ │ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ │ └── user.md
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── summarize_debate
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_git_changes
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_git_diff
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_lecture
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_legislation
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_meeting
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_micro
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── summarize_newsletter
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── summarize_paper
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── summarize_prompt
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── summarize_pull-requests
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── summarize_rpg_session
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_analyze_challenge_handling
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_check_metrics
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_create_h3_career
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_create_opening_sentences
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_describe_life_outlook
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_extract_intro_sentences
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_extract_panel_topics
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_find_blindspots
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_find_negative_thinking
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_find_neglected_goals
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_give_encouragement
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_red_team_thinking
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_threat_model_plans
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_visualize_mission_goals_projects
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── t_year_in_review
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── to_flashcards
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── transcribe_minutes
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── translate
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── tweet
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── write_essay
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── write_hackerone_report
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── write_latex
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── write_micro_essay
│ │ │ │ │ │ └── system.md
│ │ │ │ │ ├── write_nuclei_template_rule
│ │ │ │ │ │ ├── system.md
│ │ │ │ │ │ └── user.md
│ │ │ │ │ ├── write_pull-request
│ │ │ │ │ │ └── system.md
│ │ │ │ │ └── write_semgrep_rule
│ │ │ │ │ ├── system.md
│ │ │ │ │ └── user.md
│ │ │ │ └── routines
│ │ │ │ ├── list.py
│ │ │ │ ├── run.py
│ │ │ │ └── show.py
│ │ │ ├── guided_conversation
│ │ │ │ ├── __init__.py
│ │ │ │ ├── agenda.py
│ │ │ │ ├── artifact_helpers.py
│ │ │ │ ├── chat_completions
│ │ │ │ │ ├── fix_agenda_error.py
│ │ │ │ │ ├── fix_artifact_error.py
│ │ │ │ │ ├── generate_agenda.py
│ │ │ │ │ ├── generate_artifact_updates.py
│ │ │ │ │ ├── generate_final_artifact.py
│ │ │ │ │ └── generate_message.py
│ │ │ │ ├── conversation_guides
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── acrostic_poem.py
│ │ │ │ │ ├── er_triage.py
│ │ │ │ │ ├── interview.py
│ │ │ │ │ └── patient_intake.py
│ │ │ │ ├── guide.py
│ │ │ │ ├── guided_conversation_skill.py
│ │ │ │ ├── logging.py
│ │ │ │ ├── message.py
│ │ │ │ ├── resources.py
│ │ │ │ ├── routines
│ │ │ │ │ └── guided_conversation.py
│ │ │ │ └── tests
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_artifact_helpers.py
│ │ │ │ ├── test_generate_agenda.py
│ │ │ │ ├── test_generate_artifact_updates.py
│ │ │ │ ├── test_generate_final_artifact.py
│ │ │ │ └── test_resource.py
│ │ │ ├── meta
│ │ │ │ ├── __init__.py
│ │ │ │ ├── meta_skill.py
│ │ │ │ ├── README.md
│ │ │ │ └── routines
│ │ │ │ └── generate_routine.py
│ │ │ ├── posix
│ │ │ │ ├── __init__.py
│ │ │ │ ├── posix_skill.py
│ │ │ │ ├── routines
│ │ │ │ │ ├── append_file.py
│ │ │ │ │ ├── cd.py
│ │ │ │ │ ├── ls.py
│ │ │ │ │ ├── make_home_dir.py
│ │ │ │ │ ├── mkdir.py
│ │ │ │ │ ├── mv.py
│ │ │ │ │ ├── pwd.py
│ │ │ │ │ ├── read_file.py
│ │ │ │ │ ├── rm.py
│ │ │ │ │ ├── touch.py
│ │ │ │ │ └── write_file.py
│ │ │ │ └── sandbox_shell.py
│ │ │ ├── README.md
│ │ │ ├── research
│ │ │ │ ├── __init__.py
│ │ │ │ ├── README.md
│ │ │ │ ├── research_skill.py
│ │ │ │ └── routines
│ │ │ │ ├── answer_question_about_content.py
│ │ │ │ ├── evaluate_answer.py
│ │ │ │ ├── generate_research_plan.py
│ │ │ │ ├── generate_search_query.py
│ │ │ │ ├── update_research_plan.py
│ │ │ │ ├── web_research.py
│ │ │ │ └── web_search.py
│ │ │ ├── research2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── README.md
│ │ │ │ ├── research_skill.py
│ │ │ │ └── routines
│ │ │ │ ├── facts.py
│ │ │ │ ├── make_final_report.py
│ │ │ │ ├── research.py
│ │ │ │ ├── search_plan.py
│ │ │ │ ├── search.py
│ │ │ │ └── visit_pages.py
│ │ │ └── web_research
│ │ │ ├── __init__.py
│ │ │ ├── README.md
│ │ │ ├── research_skill.py
│ │ │ └── routines
│ │ │ ├── facts.py
│ │ │ ├── make_final_report.py
│ │ │ ├── research.py
│ │ │ ├── search_plan.py
│ │ │ ├── search.py
│ │ │ └── visit_pages.py
│ │ ├── tests
│ │ │ ├── test_common_skill.py
│ │ │ ├── test_integration.py
│ │ │ ├── test_routine_stack.py
│ │ │ ├── tst_skill
│ │ │ │ ├── __init__.py
│ │ │ │ └── routines
│ │ │ │ ├── __init__.py
│ │ │ │ └── a_routine.py
│ │ │ └── utilities
│ │ │ ├── test_find_template_vars.py
│ │ │ ├── test_make_arg_set.py
│ │ │ ├── test_paramspec.py
│ │ │ ├── test_parse_command_string.py
│ │ │ └── test_to_string.py
│ │ ├── types.py
│ │ ├── usage.py
│ │ └── utilities.py
│ └── uv.lock
├── LICENSE
├── Makefile
├── mcp-servers
│ ├── ai-assist-content
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── mcp-example-brave-search.md
│ │ ├── mcp-fastmcp-typescript-README.md
│ │ ├── mcp-llms-full.txt
│ │ ├── mcp-metadata-tips.md
│ │ ├── mcp-python-sdk-README.md
│ │ ├── mcp-typescript-sdk-README.md
│ │ ├── pydanticai-documentation.md
│ │ ├── pydanticai-example-question-graph.md
│ │ ├── pydanticai-example-weather.md
│ │ ├── pydanticai-tutorial.md
│ │ └── README.md
│ ├── Makefile
│ ├── mcp-server-bing-search
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server_bing_search
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── prompts
│ │ │ │ ├── __init__.py
│ │ │ │ ├── clean_website.py
│ │ │ │ └── filter_links.py
│ │ │ ├── server.py
│ │ │ ├── start.py
│ │ │ ├── tools.py
│ │ │ ├── types.py
│ │ │ ├── utils.py
│ │ │ └── web
│ │ │ ├── __init__.py
│ │ │ ├── get_content.py
│ │ │ ├── llm_processing.py
│ │ │ ├── process_website.py
│ │ │ └── search_bing.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ └── test_tools.py
│ │ └── uv.lock
│ ├── mcp-server-bundle
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server_bundle
│ │ │ ├── __init__.py
│ │ │ └── main.py
│ │ ├── pyinstaller.spec
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── mcp-server-filesystem
│ │ ├── .env.example
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── ci.yml
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server_filesystem
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── server.py
│ │ │ └── start.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ └── test_filesystem.py
│ │ └── uv.lock
│ ├── mcp-server-filesystem-edit
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── data
│ │ │ ├── attachments
│ │ │ │ ├── Daily Game Ideas.txt
│ │ │ │ ├── Frontend Framework Proposal.txt
│ │ │ │ ├── ReDoodle.txt
│ │ │ │ └── Research Template.tex
│ │ │ ├── test_cases.yaml
│ │ │ └── transcripts
│ │ │ ├── transcript_research_simple.md
│ │ │ ├── transcript_Startup_Idea_1_202503031513.md
│ │ │ ├── transcript_Startup_Idea_2_202503031659.md
│ │ │ └── transcript_Web_Frontends_202502281551.md
│ │ ├── Makefile
│ │ ├── mcp_server_filesystem_edit
│ │ │ ├── __init__.py
│ │ │ ├── app_handling
│ │ │ │ ├── __init__.py
│ │ │ │ ├── excel.py
│ │ │ │ ├── miktex.py
│ │ │ │ ├── office_common.py
│ │ │ │ ├── powerpoint.py
│ │ │ │ └── word.py
│ │ │ ├── config.py
│ │ │ ├── evals
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common.py
│ │ │ │ ├── run_comments.py
│ │ │ │ ├── run_edit.py
│ │ │ │ └── run_ppt_edit.py
│ │ │ ├── prompts
│ │ │ │ ├── __init__.py
│ │ │ │ ├── add_comments.py
│ │ │ │ ├── analyze_comments.py
│ │ │ │ ├── latex_edit.py
│ │ │ │ ├── markdown_draft.py
│ │ │ │ ├── markdown_edit.py
│ │ │ │ └── powerpoint_edit.py
│ │ │ ├── server.py
│ │ │ ├── start.py
│ │ │ ├── tools
│ │ │ │ ├── __init__.py
│ │ │ │ ├── add_comments.py
│ │ │ │ ├── edit_adapters
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ ├── latex.py
│ │ │ │ │ └── markdown.py
│ │ │ │ ├── edit.py
│ │ │ │ └── helpers.py
│ │ │ └── types.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ ├── app_handling
│ │ │ │ ├── test_excel.py
│ │ │ │ ├── test_miktext.py
│ │ │ │ ├── test_office_common.py
│ │ │ │ ├── test_powerpoint.py
│ │ │ │ └── test_word.py
│ │ │ ├── conftest.py
│ │ │ └── tools
│ │ │ └── edit_adapters
│ │ │ ├── test_latex.py
│ │ │ └── test_markdown.py
│ │ └── uv.lock
│ ├── mcp-server-fusion
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── AddInIcon.svg
│ │ ├── config.py
│ │ ├── FusionMCPServerAddIn.manifest
│ │ ├── FusionMCPServerAddIn.py
│ │ ├── mcp_server_fusion
│ │ │ ├── __init__.py
│ │ │ ├── fusion_mcp_server.py
│ │ │ ├── fusion_utils
│ │ │ │ ├── __init__.py
│ │ │ │ ├── event_utils.py
│ │ │ │ ├── general_utils.py
│ │ │ │ └── tool_utils.py
│ │ │ ├── mcp_tools
│ │ │ │ ├── __init__.py
│ │ │ │ ├── fusion_3d_operation.py
│ │ │ │ ├── fusion_geometry.py
│ │ │ │ ├── fusion_pattern.py
│ │ │ │ └── fusion_sketch.py
│ │ │ └── vendor
│ │ │ └── README.md
│ │ ├── README.md
│ │ └── requirements.txt
│ ├── mcp-server-giphy
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── giphy_search.py
│ │ │ ├── sampling.py
│ │ │ ├── server.py
│ │ │ ├── start.py
│ │ │ └── utils.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── mcp-server-memory-user-bio
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server_memory_user_bio
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── server.py
│ │ │ └── start.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── mcp-server-memory-whiteboard
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server_memory_whiteboard
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── server.py
│ │ │ └── start.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── mcp-server-office
│ │ ├── .env.example
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── build.sh
│ │ ├── data
│ │ │ ├── attachments
│ │ │ │ ├── Daily Game Ideas.txt
│ │ │ │ ├── Frontend Framework Proposal.txt
│ │ │ │ └── ReDoodle.txt
│ │ │ └── word
│ │ │ ├── test_cases.yaml
│ │ │ └── transcripts
│ │ │ ├── transcript_Startup_Idea_1_202503031513.md
│ │ │ ├── transcript_Startup_Idea_2_202503031659.md
│ │ │ └── transcript_Web_Frontends_202502281551.md
│ │ ├── Makefile
│ │ ├── mcp_server
│ │ │ ├── __init__.py
│ │ │ ├── app_interaction
│ │ │ │ ├── __init__.py
│ │ │ │ ├── excel_editor.py
│ │ │ │ ├── powerpoint_editor.py
│ │ │ │ └── word_editor.py
│ │ │ ├── config.py
│ │ │ ├── constants.py
│ │ │ ├── evals
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common.py
│ │ │ │ ├── run_comment_analysis.py
│ │ │ │ ├── run_feedback.py
│ │ │ │ └── run_markdown_edit.py
│ │ │ ├── helpers.py
│ │ │ ├── markdown_edit
│ │ │ │ ├── __init__.py
│ │ │ │ ├── comment_analysis.py
│ │ │ │ ├── feedback_step.py
│ │ │ │ ├── markdown_edit.py
│ │ │ │ └── utils.py
│ │ │ ├── prompts
│ │ │ │ ├── __init__.py
│ │ │ │ ├── comment_analysis.py
│ │ │ │ ├── feedback.py
│ │ │ │ ├── markdown_draft.py
│ │ │ │ └── markdown_edit.py
│ │ │ ├── server.py
│ │ │ ├── start.py
│ │ │ └── types.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── tests
│ │ │ └── test_word_editor.py
│ │ └── uv.lock
│ ├── mcp-server-open-deep-research
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server
│ │ │ ├── __init__.py
│ │ │ ├── config.py
│ │ │ ├── libs
│ │ │ │ └── open_deep_research
│ │ │ │ ├── cookies.py
│ │ │ │ ├── mdconvert.py
│ │ │ │ ├── run_agents.py
│ │ │ │ ├── text_inspector_tool.py
│ │ │ │ ├── text_web_browser.py
│ │ │ │ └── visual_qa.py
│ │ │ ├── open_deep_research.py
│ │ │ ├── server.py
│ │ │ └── start.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ └── uv.lock
│ ├── mcp-server-open-deep-research-clone
│ │ ├── .env.example
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json
│ │ │ └── settings.json
│ │ ├── Makefile
│ │ ├── mcp_server_open_deep_research_clone
│ │ │ ├── __init__.py
│ │ │ ├── azure_openai.py
│ │ │ ├── config.py
│ │ │ ├── logging.py
│ │ │ ├── sampling.py
│ │ │ ├── server.py
│ │ │ ├── start.py
│ │ │ ├── utils.py
│ │ │ └── web_research.py
│ │ ├── pyproject.toml
│ │ ├── README.md
│ │ ├── test
│ │ │ └── test_open_deep_research_clone.py
│ │ └── uv.lock
│ ├── mcp-server-template
│ │ ├── .taplo.toml
│ │ ├── .vscode
│ │ │ └── settings.json
│ │ ├── copier.yml
│ │ ├── README.md
│ │ └── template
│ │ └── {{ project_slug }}
│ │ ├── .env.example.jinja
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ │ ├── launch.json.jinja
│ │ │ └── settings.json
│ │ ├── {{ module_name }}
│ │ │ ├── __init__.py
│ │ │ ├── config.py.jinja
│ │ │ ├── server.py.jinja
│ │ │ └── start.py.jinja
│ │ ├── Makefile.jinja
│ │ ├── pyproject.toml.jinja
│ │ └── README.md.jinja
│ ├── mcp-server-vscode
│ │ ├── .eslintrc.cjs
│ │ ├── .gitignore
│ │ ├── .npmrc
│ │ ├── .vscode
│ │ │ ├── extensions.json
│ │ │ ├── launch.json
│ │ │ ├── settings.json
│ │ │ └── tasks.json
│ │ ├── .vscode-test.mjs
│ │ ├── .vscodeignore
│ │ ├── ASSISTANT_BOOTSTRAP.md
│ │ ├── eslint.config.mjs
│ │ ├── images
│ │ │ └── icon.png
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── out
│ │ │ ├── extension.d.ts
│ │ │ ├── extension.js
│ │ │ ├── test
│ │ │ │ ├── extension.test.d.ts
│ │ │ │ └── extension.test.js
│ │ │ ├── tools
│ │ │ │ ├── code_checker.d.ts
│ │ │ │ ├── code_checker.js
│ │ │ │ ├── debug_tools.d.ts
│ │ │ │ ├── debug_tools.js
│ │ │ │ ├── focus_editor.d.ts
│ │ │ │ ├── focus_editor.js
│ │ │ │ ├── search_symbol.d.ts
│ │ │ │ └── search_symbol.js
│ │ │ └── utils
│ │ │ ├── port.d.ts
│ │ │ └── port.js
│ │ ├── package.json
│ │ ├── pnpm-lock.yaml
│ │ ├── prettier.config.cjs
│ │ ├── README.md
│ │ ├── src
│ │ │ ├── extension.d.ts
│ │ │ ├── extension.ts
│ │ │ ├── test
│ │ │ │ ├── extension.test.d.ts
│ │ │ │ └── extension.test.ts
│ │ │ ├── tools
│ │ │ │ ├── code_checker.d.ts
│ │ │ │ ├── code_checker.ts
│ │ │ │ ├── debug_tools.d.ts
│ │ │ │ ├── debug_tools.ts
│ │ │ │ ├── focus_editor.d.ts
│ │ │ │ ├── focus_editor.ts
│ │ │ │ ├── search_symbol.d.ts
│ │ │ │ └── search_symbol.ts
│ │ │ └── utils
│ │ │ ├── port.d.ts
│ │ │ └── port.ts
│ │ ├── tsconfig.json
│ │ ├── tsconfig.tsbuildinfo
│ │ ├── vsc-extension-quickstart.md
│ │ └── webpack.config.js
│ └── mcp-server-web-research
│ ├── .env.example
│ ├── .gitignore
│ ├── .vscode
│ │ ├── launch.json
│ │ └── settings.json
│ ├── Makefile
│ ├── mcp_server_web_research
│ │ ├── __init__.py
│ │ ├── azure_openai.py
│ │ ├── config.py
│ │ ├── logging.py
│ │ ├── sampling.py
│ │ ├── server.py
│ │ ├── start.py
│ │ ├── utils.py
│ │ └── web_research.py
│ ├── pyproject.toml
│ ├── README.md
│ ├── test
│ │ └── test_web_research.py
│ └── uv.lock
├── README.md
├── RESPONSIBLE_AI_FAQ.md
├── ruff.toml
├── SECURITY.md
├── semantic-workbench.code-workspace
├── SUPPORT.md
├── tools
│ ├── build_ai_context_files.py
│ ├── collect_files.py
│ ├── docker
│ │ ├── azure_website_sshd.conf
│ │ ├── docker-entrypoint.sh
│ │ ├── Dockerfile.assistant
│ │ └── Dockerfile.mcp-server
│ ├── makefiles
│ │ ├── docker-assistant.mk
│ │ ├── docker-mcp-server.mk
│ │ ├── docker.mk
│ │ ├── python.mk
│ │ ├── recursive.mk
│ │ └── shell.mk
│ ├── reset-service-data.ps1
│ ├── reset-service-data.sh
│ ├── run-app.ps1
│ ├── run-app.sh
│ ├── run-canonical-agent.ps1
│ ├── run-canonical-agent.sh
│ ├── run-dotnet-examples-with-aspire.sh
│ ├── run-python-example1.sh
│ ├── run-python-example2.ps1
│ ├── run-python-example2.sh
│ ├── run-service.ps1
│ ├── run-service.sh
│ ├── run-workbench-chatbot.ps1
│ └── run-workbench-chatbot.sh
├── workbench-app
│ ├── .dockerignore
│ ├── .env.example
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .vscode
│ │ ├── launch.json
│ │ └── settings.json
│ ├── docker-entrypoint.sh
│ ├── Dockerfile
│ ├── docs
│ │ ├── APP_DEV_GUIDE.md
│ │ ├── MESSAGE_METADATA.md
│ │ ├── MESSAGE_TYPES.md
│ │ ├── README.md
│ │ └── STATE_INSPECTORS.md
│ ├── index.html
│ ├── Makefile
│ ├── nginx.conf
│ ├── package.json
│ ├── pnpm-lock.yaml
│ ├── prettier.config.cjs
│ ├── public
│ │ └── assets
│ │ ├── background-1-upscaled.jpg
│ │ ├── background-1-upscaled.png
│ │ ├── background-1.jpg
│ │ ├── background-1.png
│ │ ├── background-2.jpg
│ │ ├── background-2.png
│ │ ├── experimental-feature.jpg
│ │ ├── favicon.svg
│ │ ├── workflow-designer-1.jpg
│ │ ├── workflow-designer-outlets.jpg
│ │ ├── workflow-designer-states.jpg
│ │ └── workflow-designer-transitions.jpg
│ ├── README.md
│ ├── run.sh
│ ├── src
│ │ ├── components
│ │ │ ├── App
│ │ │ │ ├── AppFooter.tsx
│ │ │ │ ├── AppHeader.tsx
│ │ │ │ ├── AppMenu.tsx
│ │ │ │ ├── AppView.tsx
│ │ │ │ ├── CodeLabel.tsx
│ │ │ │ ├── CommandButton.tsx
│ │ │ │ ├── ConfirmLeave.tsx
│ │ │ │ ├── ContentExport.tsx
│ │ │ │ ├── ContentImport.tsx
│ │ │ │ ├── CopyButton.tsx
│ │ │ │ ├── DialogControl.tsx
│ │ │ │ ├── DynamicIframe.tsx
│ │ │ │ ├── ErrorListFromAppState.tsx
│ │ │ │ ├── ErrorMessageBar.tsx
│ │ │ │ ├── ExperimentalNotice.tsx
│ │ │ │ ├── FormWidgets
│ │ │ │ │ ├── BaseModelEditorWidget.tsx
│ │ │ │ │ ├── CustomizedArrayFieldTemplate.tsx
│ │ │ │ │ ├── CustomizedFieldTemplate.tsx
│ │ │ │ │ ├── CustomizedObjectFieldTemplate.tsx
│ │ │ │ │ └── InspectableWidget.tsx
│ │ │ │ ├── LabelWithDescription.tsx
│ │ │ │ ├── Loading.tsx
│ │ │ │ ├── MenuItemControl.tsx
│ │ │ │ ├── MiniControl.tsx
│ │ │ │ ├── MyAssistantServiceRegistrations.tsx
│ │ │ │ ├── MyItemsManager.tsx
│ │ │ │ ├── OverflowMenu.tsx
│ │ │ │ ├── PresenceMotionList.tsx
│ │ │ │ ├── ProfileSettings.tsx
│ │ │ │ └── TooltipWrapper.tsx
│ │ │ ├── Assistants
│ │ │ │ ├── ApplyConfigButton.tsx
│ │ │ │ ├── AssistantAdd.tsx
│ │ │ │ ├── AssistantConfigExportButton.tsx
│ │ │ │ ├── AssistantConfigImportButton.tsx
│ │ │ │ ├── AssistantConfiguration.tsx
│ │ │ │ ├── AssistantConfigure.tsx
│ │ │ │ ├── AssistantCreate.tsx
│ │ │ │ ├── AssistantDelete.tsx
│ │ │ │ ├── AssistantDuplicate.tsx
│ │ │ │ ├── AssistantExport.tsx
│ │ │ │ ├── AssistantImport.tsx
│ │ │ │ ├── AssistantRemove.tsx
│ │ │ │ ├── AssistantRename.tsx
│ │ │ │ ├── AssistantServiceInfo.tsx
│ │ │ │ ├── AssistantServiceMetadata.tsx
│ │ │ │ └── MyAssistants.tsx
│ │ │ ├── AssistantServiceRegistrations
│ │ │ │ ├── AssistantServiceRegistrationApiKey.tsx
│ │ │ │ ├── AssistantServiceRegistrationApiKeyReset.tsx
│ │ │ │ ├── AssistantServiceRegistrationCreate.tsx
│ │ │ │ └── AssistantServiceRegistrationRemove.tsx
│ │ │ ├── Conversations
│ │ │ │ ├── Canvas
│ │ │ │ │ ├── AssistantCanvas.tsx
│ │ │ │ │ ├── AssistantCanvasList.tsx
│ │ │ │ │ ├── AssistantInspector.tsx
│ │ │ │ │ ├── AssistantInspectorList.tsx
│ │ │ │ │ └── ConversationCanvas.tsx
│ │ │ │ ├── ChatInputPlugins
│ │ │ │ │ ├── ClearEditorPlugin.tsx
│ │ │ │ │ ├── LexicalMenu.ts
│ │ │ │ │ ├── ParticipantMentionsPlugin.tsx
│ │ │ │ │ ├── TypeaheadMenuPlugin.css
│ │ │ │ │ └── TypeaheadMenuPlugin.tsx
│ │ │ │ ├── ContentRenderers
│ │ │ │ │ ├── CodeContentRenderer.tsx
│ │ │ │ │ ├── ContentListRenderer.tsx
│ │ │ │ │ ├── ContentRenderer.tsx
│ │ │ │ │ ├── DiffRenderer.tsx
│ │ │ │ │ ├── HtmlContentRenderer.tsx
│ │ │ │ │ ├── JsonSchemaContentRenderer.tsx
│ │ │ │ │ ├── MarkdownContentRenderer.tsx
│ │ │ │ │ ├── MarkdownEditorRenderer.tsx
│ │ │ │ │ ├── MermaidContentRenderer.tsx
│ │ │ │ │ ├── MusicABCContentRenderer.css
│ │ │ │ │ └── MusicABCContentRenderer.tsx
│ │ │ │ ├── ContextWindow.tsx
│ │ │ │ ├── ConversationCreate.tsx
│ │ │ │ ├── ConversationDuplicate.tsx
│ │ │ │ ├── ConversationExport.tsx
│ │ │ │ ├── ConversationFileIcon.tsx
│ │ │ │ ├── ConversationRemove.tsx
│ │ │ │ ├── ConversationRename.tsx
│ │ │ │ ├── ConversationShare.tsx
│ │ │ │ ├── ConversationShareCreate.tsx
│ │ │ │ ├── ConversationShareList.tsx
│ │ │ │ ├── ConversationShareView.tsx
│ │ │ │ ├── ConversationsImport.tsx
│ │ │ │ ├── ConversationTranscript.tsx
│ │ │ │ ├── DebugInspector.tsx
│ │ │ │ ├── FileItem.tsx
│ │ │ │ ├── FileList.tsx
│ │ │ │ ├── InputAttachmentList.tsx
│ │ │ │ ├── InputOptionsControl.tsx
│ │ │ │ ├── InteractHistory.tsx
│ │ │ │ ├── InteractInput.tsx
│ │ │ │ ├── Message
│ │ │ │ │ ├── AttachmentSection.tsx
│ │ │ │ │ ├── ContentRenderer.tsx
│ │ │ │ │ ├── ContentSafetyNotice.tsx
│ │ │ │ │ ├── InteractMessage.tsx
│ │ │ │ │ ├── MessageActions.tsx
│ │ │ │ │ ├── MessageBase.tsx
│ │ │ │ │ ├── MessageBody.tsx
│ │ │ │ │ ├── MessageContent.tsx
│ │ │ │ │ ├── MessageFooter.tsx
│ │ │ │ │ ├── MessageHeader.tsx
│ │ │ │ │ ├── NotificationAccordion.tsx
│ │ │ │ │ └── ToolResultMessage.tsx
│ │ │ │ ├── MessageDelete.tsx
│ │ │ │ ├── MessageLink.tsx
│ │ │ │ ├── MyConversations.tsx
│ │ │ │ ├── MyShares.tsx
│ │ │ │ ├── ParticipantAvatar.tsx
│ │ │ │ ├── ParticipantAvatarGroup.tsx
│ │ │ │ ├── ParticipantItem.tsx
│ │ │ │ ├── ParticipantList.tsx
│ │ │ │ ├── ParticipantStatus.tsx
│ │ │ │ ├── RewindConversation.tsx
│ │ │ │ ├── ShareRemove.tsx
│ │ │ │ ├── SpeechButton.tsx
│ │ │ │ └── ToolCalls.tsx
│ │ │ └── FrontDoor
│ │ │ ├── Chat
│ │ │ │ ├── AssistantDrawer.tsx
│ │ │ │ ├── CanvasDrawer.tsx
│ │ │ │ ├── Chat.tsx
│ │ │ │ ├── ChatCanvas.tsx
│ │ │ │ ├── ChatControls.tsx
│ │ │ │ └── ConversationDrawer.tsx
│ │ │ ├── Controls
│ │ │ │ ├── AssistantCard.tsx
│ │ │ │ ├── AssistantSelector.tsx
│ │ │ │ ├── AssistantServiceSelector.tsx
│ │ │ │ ├── ConversationItem.tsx
│ │ │ │ ├── ConversationList.tsx
│ │ │ │ ├── ConversationListOptions.tsx
│ │ │ │ ├── NewConversationButton.tsx
│ │ │ │ ├── NewConversationForm.tsx
│ │ │ │ └── SiteMenuButton.tsx
│ │ │ ├── GlobalContent.tsx
│ │ │ └── MainContent.tsx
│ │ ├── Constants.ts
│ │ ├── global.d.ts
│ │ ├── index.css
│ │ ├── libs
│ │ │ ├── AppStorage.ts
│ │ │ ├── AuthHelper.ts
│ │ │ ├── EventSubscriptionManager.ts
│ │ │ ├── Theme.ts
│ │ │ ├── useAssistantCapabilities.ts
│ │ │ ├── useChatCanvasController.ts
│ │ │ ├── useConversationEvents.ts
│ │ │ ├── useConversationUtility.ts
│ │ │ ├── useCreateConversation.ts
│ │ │ ├── useDebugComponentLifecycle.ts
│ │ │ ├── useDragAndDrop.ts
│ │ │ ├── useEnvironment.ts
│ │ │ ├── useExportUtility.ts
│ │ │ ├── useHistoryUtility.ts
│ │ │ ├── useKeySequence.ts
│ │ │ ├── useMediaQuery.ts
│ │ │ ├── useMicrosoftGraph.ts
│ │ │ ├── useNotify.tsx
│ │ │ ├── useParticipantUtility.tsx
│ │ │ ├── useSiteUtility.ts
│ │ │ ├── useWorkbenchEventSource.ts
│ │ │ ├── useWorkbenchService.ts
│ │ │ └── Utility.ts
│ │ ├── main.tsx
│ │ ├── models
│ │ │ ├── Assistant.ts
│ │ │ ├── AssistantCapability.ts
│ │ │ ├── AssistantServiceInfo.ts
│ │ │ ├── AssistantServiceRegistration.ts
│ │ │ ├── Config.ts
│ │ │ ├── Conversation.ts
│ │ │ ├── ConversationFile.ts
│ │ │ ├── ConversationMessage.ts
│ │ │ ├── ConversationMessageDebug.ts
│ │ │ ├── ConversationParticipant.ts
│ │ │ ├── ConversationShare.ts
│ │ │ ├── ConversationShareRedemption.ts
│ │ │ ├── ConversationState.ts
│ │ │ ├── ConversationStateDescription.ts
│ │ │ ├── ServiceEnvironment.ts
│ │ │ └── User.ts
│ │ ├── redux
│ │ │ ├── app
│ │ │ │ ├── hooks.ts
│ │ │ │ ├── rtkQueryErrorLogger.ts
│ │ │ │ └── store.ts
│ │ │ └── features
│ │ │ ├── app
│ │ │ │ ├── appSlice.ts
│ │ │ │ └── AppState.ts
│ │ │ ├── chatCanvas
│ │ │ │ ├── chatCanvasSlice.ts
│ │ │ │ └── ChatCanvasState.ts
│ │ │ ├── localUser
│ │ │ │ ├── localUserSlice.ts
│ │ │ │ └── LocalUserState.ts
│ │ │ └── settings
│ │ │ ├── settingsSlice.ts
│ │ │ └── SettingsState.ts
│ │ ├── Root.tsx
│ │ ├── routes
│ │ │ ├── AcceptTerms.tsx
│ │ │ ├── AssistantEditor.tsx
│ │ │ ├── AssistantServiceRegistrationEditor.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── ErrorPage.tsx
│ │ │ ├── FrontDoor.tsx
│ │ │ ├── Login.tsx
│ │ │ ├── Settings.tsx
│ │ │ ├── ShareRedeem.tsx
│ │ │ └── Shares.tsx
│ │ ├── services
│ │ │ └── workbench
│ │ │ ├── assistant.ts
│ │ │ ├── assistantService.ts
│ │ │ ├── conversation.ts
│ │ │ ├── file.ts
│ │ │ ├── index.ts
│ │ │ ├── participant.ts
│ │ │ ├── share.ts
│ │ │ ├── state.ts
│ │ │ └── workbench.ts
│ │ └── vite-env.d.ts
│ ├── tools
│ │ └── filtered-ts-prune.cjs
│ ├── tsconfig.json
│ └── vite.config.ts
└── workbench-service
├── .env.example
├── .vscode
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── alembic.ini
├── devdb
│ ├── docker-compose.yaml
│ └── postgresql-init.sh
├── Dockerfile
├── Makefile
├── migrations
│ ├── env.py
│ ├── README
│ ├── script.py.mako
│ └── versions
│ ├── 2024_09_19_000000_69dcda481c14_init.py
│ ├── 2024_09_19_190029_dffb1d7e219a_file_version_filename.py
│ ├── 2024_09_20_204130_b29524775484_share.py
│ ├── 2024_10_30_231536_039bec8edc33_index_message_type.py
│ ├── 2024_11_04_204029_5149c7fb5a32_conversationmessagedebug.py
│ ├── 2024_11_05_015124_245baf258e11_double_check_debugs.py
│ ├── 2024_11_25_191056_a106de176394_drop_workflow.py
│ ├── 2025_03_19_140136_aaaf792d4d72_set_user_title_set.py
│ ├── 2025_03_21_153250_3763629295ad_add_assistant_template_id.py
│ ├── 2025_05_19_163613_b2f86e981885_delete_context_transfer_assistants.py
│ └── 2025_06_18_174328_503c739152f3_delete_knowlege_transfer_assistants.py
├── pyproject.toml
├── README.md
├── semantic_workbench_service
│ ├── __init__.py
│ ├── api.py
│ ├── assistant_api_key.py
│ ├── auth.py
│ ├── azure_speech.py
│ ├── config.py
│ ├── controller
│ │ ├── __init__.py
│ │ ├── assistant_service_client_pool.py
│ │ ├── assistant_service_registration.py
│ │ ├── assistant.py
│ │ ├── conversation_share.py
│ │ ├── conversation.py
│ │ ├── convert.py
│ │ ├── exceptions.py
│ │ ├── export_import.py
│ │ ├── file.py
│ │ ├── participant.py
│ │ └── user.py
│ ├── db.py
│ ├── event.py
│ ├── files.py
│ ├── logging_config.py
│ ├── middleware.py
│ ├── query.py
│ ├── service_user_principals.py
│ ├── service.py
│ └── start.py
├── tests
│ ├── __init__.py
│ ├── conftest.py
│ ├── docker-compose.yaml
│ ├── test_assistant_api_key.py
│ ├── test_files.py
│ ├── test_integration.py
│ ├── test_middleware.py
│ ├── test_migrations.py
│ ├── test_workbench_service.py
│ └── types.py
└── uv.lock
```
# Files
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/create_git_diff_commit/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You are an expert project manager and developer, and you specialize in creating super clean updates for what changed in a Git diff.
4 |
5 | # STEPS
6 |
7 | - Read the input and figure out what the major changes and upgrades were that happened.
8 |
9 | - Create the git commands needed to add the changes to the repo, and a git commit to reflect the changes
10 |
11 | - If there are a lot of changes include more bullets. If there are only a few changes, be more terse.
12 |
13 | # OUTPUT INSTRUCTIONS
14 |
15 | - Use conventional commits - i.e. prefix the commit title with "chore:" (if it's a minor change like refactoring or linting), "feat:" (if it's a new feature), "fix:" if its a bug fix
16 |
17 | - You only output human readable Markdown, except for the links, which should be in HTML format.
18 |
19 | - The output should only be the shell commands needed to update git.
20 |
21 | - Do not place the output in a code block
22 |
23 | # OUTPUT TEMPLATE
24 |
25 | #Example Template:
26 | For the current changes, replace `<file_name>` with `temp.py` and `<commit_message>` with `Added --newswitch switch to temp.py to do newswitch behavior`:
27 |
28 | git add temp.py
29 | git commit -m "Added --newswitch switch to temp.py to do newswitch behavior"
30 | #EndTemplate
31 |
32 |
33 | # INPUT:
34 |
35 | INPUT:
36 |
```
--------------------------------------------------------------------------------
/workbench-app/src/routes/ErrorPage.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import { MessageBar, MessageBarBody } from '@fluentui/react-components';
4 | import React from 'react';
5 | import { isRouteErrorResponse, useRouteError } from 'react-router-dom';
6 | import { AppView } from '../components/App/AppView';
7 | import { useSiteUtility } from '../libs/useSiteUtility';
8 |
9 | export const ErrorPage: React.FC = () => {
10 | const error = useRouteError();
11 | const siteUtility = useSiteUtility();
12 |
13 | siteUtility.setDocumentTitle('Error');
14 |
15 | let errorMessage: string;
16 |
17 | if (isRouteErrorResponse(error)) {
18 | // error is type `ErrorResponse`
19 | errorMessage = error.data || error.statusText;
20 | } else if (error instanceof Error) {
21 | // error is type `Error`
22 | errorMessage = error.message;
23 | } else if (typeof error === 'string') {
24 | // error is type `string`
25 | errorMessage = error;
26 | } else {
27 | // error is type `unknown`
28 | errorMessage = 'Unknown error';
29 | }
30 |
31 | return (
32 | <AppView title="Error">
33 | <MessageBar intent="error" layout="multiline">
34 | <MessageBarBody>{errorMessage}</MessageBarBody>
35 | </MessageBar>
36 | </AppView>
37 | );
38 | };
39 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_threat_report_trends/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You are a super-intelligent cybersecurity expert. You specialize in extracting the surprising, insightful, and interesting information from cybersecurity threat reports.
4 |
5 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
6 |
7 | # STEPS
8 |
9 | - Read the entire threat report from an expert perspective, thinking deeply about what's new, interesting, and surprising in the report.
10 |
11 | - Extract up to 50 of the most surprising, insightful, and/or interesting trends from the input in a section called TRENDS:. If there are less than 50 then collect all of them. Make sure you extract at least 20.
12 |
13 | # OUTPUT INSTRUCTIONS
14 |
15 | - Only output Markdown.
16 | - Do not output the markdown code syntax, only the content.
17 | - Do not use bold or italics formatting in the markdown output.
18 | - Extract at least 20 TRENDS from the content.
19 | - Do not give warnings or notes; only output the requested sections.
20 | - You use bulleted lists for output, not numbered lists.
21 | - Do not repeat ideas, quotes, facts, or resources.
22 | - Do not start items with the same opening words.
23 | - Ensure you follow ALL these instructions when creating your output.
24 |
25 | # INPUT
26 |
27 | INPUT:
28 |
```
--------------------------------------------------------------------------------
/workbench-app/src/routes/Shares.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import React from 'react';
4 | import { AppView } from '../components/App/AppView';
5 | import { Loading } from '../components/App/Loading';
6 | import { MyShares } from '../components/Conversations/MyShares';
7 | import { useSiteUtility } from '../libs/useSiteUtility';
8 | import { useGetSharesQuery } from '../services/workbench/share';
9 |
10 | export const Shares: React.FC = () => {
11 | const {
12 | data: conversationShares,
13 | error: conversationSharesError,
14 | isLoading: isLoadingConversationShares,
15 | } = useGetSharesQuery({
16 | conversationId: undefined,
17 | includeUnredeemable: false,
18 | });
19 |
20 | const siteUtility = useSiteUtility();
21 | siteUtility.setDocumentTitle('Shares');
22 |
23 | if (conversationSharesError) {
24 | throw new Error(`Error loading conversation shares: ${JSON.stringify(conversationSharesError)}`);
25 | }
26 |
27 | if (isLoadingConversationShares) {
28 | return (
29 | <AppView title="Shares">
30 | <Loading />
31 | </AppView>
32 | );
33 | }
34 |
35 | return (
36 | <AppView title="Shares">
37 | <MyShares hideInstruction={true} shares={conversationShares ?? []} />
38 | </AppView>
39 | );
40 | };
41 |
```
--------------------------------------------------------------------------------
/workbench-service/semantic_workbench_service/api.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | from contextlib import AsyncExitStack, asynccontextmanager
3 | from typing import AsyncContextManager, AsyncGenerator, Callable
4 |
5 | from fastapi import FastAPI
6 |
7 | logger = logging.getLogger(__name__)
8 |
9 |
10 | class FastAPILifespan:
11 | def __init__(self) -> None:
12 | self._lifecycle_handlers: list[Callable[[], AsyncContextManager[None]]] = []
13 |
14 | def register_handler(self, handler: Callable[[], AsyncContextManager[None]]) -> None:
15 | self._lifecycle_handlers.append(handler)
16 |
17 | @asynccontextmanager
18 | async def lifespan(self, app: FastAPI) -> AsyncGenerator[None, None]:
19 | async with AsyncExitStack() as stack:
20 | logger.debug("app lifespan starting up; title: %s, version: %s", app.title, app.version)
21 |
22 | for handler in self._lifecycle_handlers:
23 | await stack.enter_async_context(handler())
24 |
25 | logger.info("app lifespan started; title: %s, version: %s", app.title, app.version)
26 |
27 | try:
28 | yield
29 | finally:
30 | logger.debug("app lifespan shutting down; title: %s, version: %s", app.title, app.version)
31 |
32 | logger.info("app lifespan shut down; title: %s, version: %s", app.title, app.version)
33 |
```
--------------------------------------------------------------------------------
/assistants/explorer-assistant/pyproject.toml:
--------------------------------------------------------------------------------
```toml
1 | [project]
2 | name = "explorer-assistant"
3 | version = "0.1.0"
4 | description = "A python Semantic Workbench OpenAI assistant for exploring capabilities."
5 | authors = [{ name = "Semantic Workbench Team" }]
6 | readme = "README.md"
7 | requires-python = ">=3.11"
8 | dependencies = [
9 | "anthropic>=0.40.0",
10 | "anthropic-client>=0.1.0",
11 | "assistant-drive>=0.1.0",
12 | "assistant-extensions[attachments]>=0.1.0",
13 | "content-safety>=0.1.0",
14 | "deepmerge>=2.0",
15 | "html2docx>=1.6.0",
16 | "markdown>=3.6",
17 | "openai>=1.61.0",
18 | "openai-client>=0.1.0",
19 | ]
20 |
21 | [tool.hatch.build.targets.wheel]
22 | packages = ["assistant"]
23 |
24 | [tool.uv]
25 | package = true
26 |
27 | [tool.uv.sources]
28 | anthropic-client = { path = "../../libraries/python/anthropic-client", editable = true }
29 | assistant-drive = { path = "../../libraries/python/assistant-drive", editable = true }
30 | assistant-extensions = { path = "../../libraries/python/assistant-extensions", editable = true }
31 | content-safety = { path = "../../libraries/python/content-safety/", editable = true }
32 | openai-client = { path = "../../libraries/python/openai-client", editable = true }
33 |
34 | [build-system]
35 | requires = ["hatchling"]
36 | build-backend = "hatchling.build"
37 |
38 | [dependency-groups]
39 | dev = ["pyright>=1.1.389"]
40 |
```
--------------------------------------------------------------------------------
/libraries/python/assistant-data-gen/.vscode/settings.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "editor.bracketPairColorization.enabled": true,
3 | "editor.codeActionsOnSave": {
4 | "source.organizeImports": "explicit",
5 | "source.fixAll": "explicit"
6 | },
7 | "editor.guides.bracketPairs": "active",
8 | "editor.formatOnPaste": true,
9 | "editor.formatOnType": true,
10 | "editor.formatOnSave": true,
11 | "files.eol": "\n",
12 | "files.trimTrailingWhitespace": true,
13 | "python.analysis.autoFormatStrings": true,
14 | "python.analysis.autoImportCompletions": true,
15 | "python.analysis.diagnosticMode": "workspace",
16 | "python.analysis.fixAll": [
17 | "source.unusedImports"
18 | ],
19 | "python.analysis.inlayHints.functionReturnTypes": true,
20 | "python.analysis.typeCheckingMode": "standard",
21 | "python.defaultInterpreterPath": "${workspaceFolder}/.venv",
22 | "python.testing.pytestEnabled": false,
23 | "[python]": {
24 | "editor.defaultFormatter": "charliermarsh.ruff",
25 | "editor.formatOnSave": true,
26 | "editor.codeActionsOnSave": {
27 | "source.fixAll": "explicit",
28 | "source.unusedImports": "explicit",
29 | "source.organizeImports": "explicit",
30 | "source.formatDocument": "explicit"
31 | }
32 | },
33 | "ruff.nativeServer": "on",
34 | "search.exclude": {
35 | "**/.venv": true,
36 | "**/.data": true,
37 | "**/__pycache__": true
38 | },
39 | }
```
--------------------------------------------------------------------------------
/libraries/python/chat-context-toolkit/.vscode/settings.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "editor.bracketPairColorization.enabled": true,
3 | "editor.codeActionsOnSave": {
4 | "source.organizeImports": "explicit",
5 | "source.fixAll": "explicit"
6 | },
7 | "editor.guides.bracketPairs": "active",
8 | "editor.formatOnPaste": true,
9 | "editor.formatOnType": true,
10 | "editor.formatOnSave": true,
11 | "files.eol": "\n",
12 | "files.trimTrailingWhitespace": true,
13 | "python.analysis.autoFormatStrings": true,
14 | "python.analysis.autoImportCompletions": true,
15 | "python.analysis.diagnosticMode": "workspace",
16 | "python.analysis.fixAll": [
17 | "source.unusedImports"
18 | ],
19 | "python.analysis.inlayHints.functionReturnTypes": true,
20 | "python.analysis.typeCheckingMode": "standard",
21 | "python.defaultInterpreterPath": "${workspaceFolder}/.venv",
22 | "python.testing.pytestEnabled": true,
23 | "[python]": {
24 | "editor.defaultFormatter": "charliermarsh.ruff",
25 | "editor.formatOnSave": true,
26 | "editor.codeActionsOnSave": {
27 | "source.fixAll": "explicit",
28 | "source.unusedImports": "explicit",
29 | "source.organizeImports": "explicit",
30 | "source.formatDocument": "explicit"
31 | }
32 | },
33 | "ruff.nativeServer": "on",
34 | "search.exclude": {
35 | "**/.venv": true,
36 | "**/.data": true,
37 | "**/__pycache__": true
38 | },
39 | }
40 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/App/MenuItemControl.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import { ButtonProps, MenuItem } from '@fluentui/react-components';
4 | import React from 'react';
5 | import { TooltipWrapper } from './TooltipWrapper';
6 |
7 | type MenuItemControlProps = ButtonProps & {
8 | label?: string;
9 | description?: string;
10 | onClick?: () => void;
11 | iconOnly?: boolean;
12 | };
13 |
14 | export const MenuItemControl: React.FC<MenuItemControlProps> = (props) => {
15 | const { disabled, icon, label, description, onClick, iconOnly } = props;
16 |
17 | let menuItem = null;
18 |
19 | if (iconOnly) {
20 | if (description) {
21 | menuItem = (
22 | <TooltipWrapper content={description}>
23 | <MenuItem disabled={disabled} icon={icon} onClick={onClick} />
24 | </TooltipWrapper>
25 | );
26 | } else {
27 | menuItem = <MenuItem disabled={disabled} icon={icon} onClick={onClick} />;
28 | }
29 | } else {
30 | menuItem = (
31 | <MenuItem disabled={disabled} icon={icon} onClick={onClick}>
32 | {label}
33 | </MenuItem>
34 | );
35 | if (description) {
36 | menuItem = <TooltipWrapper content={description}>{menuItem}</TooltipWrapper>;
37 | }
38 | }
39 | return menuItem;
40 | };
41 |
```
--------------------------------------------------------------------------------
/assistants/navigator-assistant/assistant/response/local_tool/model.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Any, Awaitable, Callable, Generic, TypeVar
2 |
3 | from attr import dataclass
4 | from pydantic import BaseModel, ValidationError
5 | from semantic_workbench_assistant.assistant_app import ConversationContext
6 |
7 | from ..utils import ExecutableTool
8 |
9 | ToolArgumentModelT = TypeVar("ToolArgumentModelT", bound=BaseModel)
10 |
11 |
12 | @dataclass
13 | class LocalTool(Generic[ToolArgumentModelT]):
14 | name: str
15 | argument_model: type[ToolArgumentModelT]
16 | func: Callable[[ToolArgumentModelT, ConversationContext], Awaitable[str]]
17 | description: str = ""
18 |
19 | def to_executable(self) -> ExecutableTool:
20 | async def func(context: ConversationContext, arguments: dict[str, Any]) -> str:
21 | try:
22 | typed_argument = self.argument_model.model_validate(arguments)
23 | except ValidationError as e:
24 | content = f"Error validating local tool call arguments: {e}"
25 | else:
26 | content = await self.func(typed_argument, context)
27 |
28 | return content
29 |
30 | return ExecutableTool(
31 | name=self.name,
32 | description=self.description or self.func.__doc__ or "",
33 | parameters=self.argument_model.model_json_schema(),
34 | func=func,
35 | )
36 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_proposition/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 | You are an AI assistant whose primary responsibility is to analyze a federal, state, or local ballot proposition. You will meticulously examine the proposition to identify key elements such as the purpose, potential impact, arguments for and against, and any relevant background information. Your goal is to provide a comprehensive analysis that helps users understand the implications of the ballot proposition.
3 |
4 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
5 |
6 | # STEPS
7 | - Identify the key components of a federal, state, or local ballot propositions.
8 | - Develop a framework for analyzing the purpose of the proposition.
9 | - Assess the potential impact of the proposition if passed.
10 | - Compile arguments for and against the proposition.
11 | - Gather relevant background information and context.
12 | - Organize the analysis in a clear and structured format.
13 |
14 | # OUTPUT INSTRUCTIONS
15 | - Only output Markdown.
16 | - All sections should be Heading level 1.
17 | - Subsections should be one Heading level higher than its parent section.
18 | - All bullets should have their own paragraph.
19 | - Ensure you follow ALL these instructions when creating your output.
20 |
21 | # INPUT
22 | INPUT:
23 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/Message/AttachmentSection.tsx:
--------------------------------------------------------------------------------
```typescript
1 | import { Attachment, AttachmentList } from '@fluentui-copilot/react-copilot';
2 | import { makeStyles, mergeClasses, tokens } from '@fluentui/react-components';
3 | import React from 'react';
4 | import { TooltipWrapper } from '../../App/TooltipWrapper';
5 | import { ConversationFileIcon } from '../ConversationFileIcon';
6 |
7 | const useClasses = makeStyles({
8 | root: {
9 | display: 'flex',
10 | flexDirection: 'column',
11 | gap: tokens.spacingVerticalS,
12 | },
13 | });
14 |
15 | interface AttachmentSectionProps {
16 | filenames?: string[];
17 | className?: string;
18 | }
19 |
20 | export const AttachmentSection: React.FC<AttachmentSectionProps> = (props) => {
21 | const { filenames, className } = props;
22 | const classes = useClasses();
23 |
24 | const attachmentList =
25 | filenames && filenames.length > 0 ? (
26 | <AttachmentList>
27 | {filenames.map((filename) => (
28 | <TooltipWrapper content={filename} key={filename}>
29 | <Attachment media={<ConversationFileIcon file={filename} />} content={filename} />
30 | </TooltipWrapper>
31 | ))}
32 | </AttachmentList>
33 | ) : null;
34 |
35 | return <div className={mergeClasses(classes.root, className)}>{attachmentList}</div>;
36 | };
37 |
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-template/copier.yml:
--------------------------------------------------------------------------------
```yaml
1 | _subdirectory: template
2 | _tasks:
3 | # format files after copying
4 | - "make format"
5 |
6 | short_name:
7 | type: str
8 | help: >
9 | The short name for your MCP server, will have "MCP Server" appended in
10 | README.md and other mentions.
11 | default: Hello World
12 |
13 | description:
14 | type: str
15 | help: A short description of your MCP server functionality.
16 |
17 | project_slug:
18 | type: str
19 | help: The terminal-friendly and PyPi-friendly name for your project (dashes instead of spaces).
20 | default: mcp-server-{{ short_name.lower().replace(' ', '-') }}
21 |
22 | module_name:
23 | type: str
24 | help: The code-friendly name for your module (underscores instead of dashes or spaces).
25 | default: "{{ project_slug.lower().replace('-', '_') }}"
26 |
27 | author_name:
28 | type: str
29 | help: The person or entity to list as the author in the project package.
30 | default: Semantic Workbench Team
31 |
32 | default_port:
33 | type: int
34 | help: What is the default port to configure your MCP server to run on?
35 |
36 | use_mcp_env_vars:
37 | type: bool
38 | help: >
39 | Will your MCP server require env vars passed from MCP clients, such as
40 | API keys or other client provided configuration values?
41 | default: false
42 |
43 | mcp_env_vars:
44 | type: yaml
45 | when: "{{ use_mcp_env_vars }}"
46 | help: List the required env vars.
47 | default: []
48 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/summarize/dmiessler/summarize/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You are a summarization system that extracts the most interesting, useful, and surprising aspects of an article.
4 |
5 | Take a step back and think step by step about how to achieve the best result possible as defined in the steps below. You have a lot of freedom to make this work well.
6 |
7 | ## OUTPUT SECTIONS
8 |
9 | 1. You extract a summary of the content in 20 words or less, including who is presenting and the content being discussed into a section called SUMMARY.
10 |
11 | 2. You extract the top 20 ideas from the input in a section called IDEAS:.
12 |
13 | 3. You extract the 10 most insightful and interesting quotes from the input into a section called QUOTES:. Use the exact quote text from the input.
14 |
15 | 4. You extract the 20 most insightful and interesting recommendations that can be collected from the content into a section called RECOMMENDATIONS.
16 |
17 | 5. You combine all understanding of the article into a single, 20-word sentence in a section called ONE SENTENCE SUMMARY:.
18 |
19 | ## OUTPUT INSTRUCTIONS
20 |
21 | 1. You only output Markdown.
22 | 2. Do not give warnings or notes; only output the requested sections.
23 | 3. You use numbered lists, not bullets.
24 | 4. Do not repeat ideas, quotes, facts, or resources.
25 | 5. Do not start items with the same opening words.
26 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/ConversationShareList.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import React from 'react';
4 | import { Conversation } from '../../models/Conversation';
5 | import { useGetSharesQuery } from '../../services/workbench/share';
6 | import { Loading } from '../App/Loading';
7 | import { MyShares } from './MyShares';
8 |
9 | interface ConversationShareListProps {
10 | conversation: Conversation;
11 | }
12 |
13 | export const ConversationShareList: React.FC<ConversationShareListProps> = (props) => {
14 | const { conversation } = props;
15 | const {
16 | data: conversationShares,
17 | error: conversationSharesError,
18 | isLoading: conversationSharesLoading,
19 | } = useGetSharesQuery({
20 | conversationId: conversation.id,
21 | includeUnredeemable: false,
22 | });
23 |
24 | if (!conversation) {
25 | throw new Error('Conversation is required');
26 | }
27 |
28 | if (conversationSharesError) {
29 | throw new Error(`Error loading conversation shares: ${JSON.stringify(conversationSharesError)}`);
30 | }
31 |
32 | if (conversationSharesLoading || !conversationShares) {
33 | return <Loading />;
34 | }
35 |
36 | return (
37 | <MyShares
38 | conversation={conversation}
39 | shares={conversationShares}
40 | title={`Shares for "${conversation.title}"`}
41 | />
42 | );
43 | };
44 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/extract_book_recommendations/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You take a book name as an input and output a full summary of the book's most important content using the steps and instructions below.
4 |
5 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
6 |
7 | # STEPS
8 |
9 | - Scour your memory for everything you know about this book.
10 |
11 | - Extract 50 to 100 of the most practical RECOMMENDATIONS from the input in a section called RECOMMENDATIONS:. If there are less than 50 then collect all of them. Make sure you extract at least 20.
12 |
13 | # OUTPUT INSTRUCTIONS
14 |
15 | - Only output Markdown.
16 |
17 | - Order the recommendations by the most powerful and important ones first.
18 |
19 | - Write all recommendations as instructive advice, not abstract ideas.
20 |
21 |
22 | - Extract at least 50 RECOMMENDATIONS from the content.
23 |
24 | - Extract up to 100 RECOMMENDATIONS.
25 |
26 | - Limit each bullet to a maximum of 20 words.
27 |
28 | - Do not give warnings or notes; only output the requested sections.
29 |
30 | - Do not repeat IDEAS.
31 |
32 | - Vary the wording of the IDEAS.
33 |
34 | - Don't repeat the same IDEAS over and over, even if you're using different wording.
35 |
36 | - You use bulleted lists for output, not numbered lists.
37 |
38 | - Ensure you follow ALL these instructions when creating your output.
39 |
40 | # INPUT
41 |
42 | INPUT:
43 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/Message/MessageContent.tsx:
--------------------------------------------------------------------------------
```typescript
1 | import React from 'react';
2 |
3 | import { Conversation } from '../../../models/Conversation';
4 | import { ConversationMessage } from '../../../models/ConversationMessage';
5 | import { useCreateConversationMessageMutation } from '../../../services/workbench';
6 | import { ContentRenderer } from '../ContentRenderers/ContentRenderer';
7 |
8 | interface MessageContentProps {
9 | conversation: Conversation;
10 | message: ConversationMessage;
11 | }
12 |
13 | export const MessageContent: React.FC<MessageContentProps> = (props) => {
14 | const { conversation, message } = props;
15 |
16 | const [createConversationMessage] = useCreateConversationMessageMutation();
17 |
18 | const onSubmit = async (data: string) => {
19 | if (message.metadata?.command) {
20 | await createConversationMessage({
21 | conversationId: conversation.id,
22 | content: JSON.stringify({
23 | command: message.metadata.command,
24 | parameters: data,
25 | }),
26 | messageType: 'command',
27 | });
28 | }
29 | };
30 |
31 | return (
32 | <ContentRenderer
33 | content={message.content}
34 | contentType={message.contentType}
35 | metadata={message.metadata}
36 | onSubmit={onSubmit}
37 | />
38 | );
39 | };
40 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/analyze_candidates/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 | You are an AI assistant whose primary responsibility is to create a pattern that analyzes and compares two running candidates. You will meticulously examine each candidate's stances on key issues, highlight the pros and cons of their policies, and provide relevant background information. Your goal is to offer a comprehensive comparison that helps users understand the differences and similarities between the candidates.
3 |
4 | Take a step back and think step-by-step about how to achieve the best possible results by following the steps below.
5 |
6 | # STEPS
7 | - Identify the key issues relevant to the election.
8 | - Gather detailed information on each candidate's stance on these issues.
9 | - Analyze the pros and cons of each candidate's policies.
10 | - Compile background information that may influence their positions.
11 | - Compare and contrast the candidates' stances and policy implications.
12 | - Organize the analysis in a clear and structured format.
13 |
14 | # OUTPUT INSTRUCTIONS
15 | - Only output Markdown.
16 | - All sections should be Heading level 1.
17 | - Subsections should be one Heading level higher than its parent section.
18 | - All bullets should have their own paragraph.
19 | - Ensure you follow ALL these instructions when creating your output.
20 |
21 | # INPUT
22 | INPUT:
```
--------------------------------------------------------------------------------
/assistants/project-assistant/assistant/tools/todo.py:
--------------------------------------------------------------------------------
```python
1 | import uuid
2 | from enum import Enum
3 |
4 | from pydantic import BaseModel, Field
5 |
6 |
7 | class ToDoItemStatus(Enum):
8 | """
9 | Enum for the status of a to-do item.
10 | """
11 |
12 | PENDING = "pending"
13 | IN_PROGRESS = "in_progress"
14 | COMPLETED = "completed"
15 |
16 |
17 | class ToDoItemPriority(Enum):
18 | """
19 | Enum for the priority of a to-do item.
20 | """
21 |
22 | HIGH = "high"
23 | MEDIUM = "medium"
24 | LOW = "low"
25 |
26 |
27 | class ToDoItem(BaseModel):
28 | """
29 | A class to represent a single to-do item.
30 | """
31 |
32 | id: str = Field(default_factory=lambda: str(uuid.uuid4())) # Unique identifier
33 | content: str
34 | priority: str = "medium" # Default priority is 'medium'
35 | status: str = "pending" # Default status is 'pending'
36 |
37 |
38 | class ToDoList(BaseModel):
39 | """
40 | A class to represent a to-do list.
41 | """
42 |
43 | items: list[ToDoItem] = Field(default_factory=list)
44 |
45 | def add(self, todo: ToDoItem) -> None:
46 | """
47 | Add a new to-do item.
48 | """
49 | self.items.append(todo)
50 |
51 | def remove(self, id: str) -> None:
52 | """
53 | Remove a to-do item.
54 | """
55 | self.items = [item for item in self.items if item.id != id]
56 |
57 | def list(self) -> list[ToDoItem]:
58 | """
59 | List all to-do items.
60 | """
61 | return self.items
62 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/common/routines/get_content_from_url.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Any
2 |
3 | import requests
4 | from bs4 import BeautifulSoup
5 | from skill_library import AskUserFn, EmitFn, RunContext, RunRoutineFn
6 | from skill_library.logging import extra_data, logger
7 |
8 | TIMEOUT_SECONDS = 5
9 |
10 |
11 | async def main(
12 | context: RunContext,
13 | routine_state: dict[str, Any],
14 | emit: EmitFn,
15 | run: RunRoutineFn,
16 | ask_user: AskUserFn,
17 | url: str,
18 | max_length: int | None = None,
19 | ) -> str:
20 | """Get the content from a webpage."""
21 |
22 | try:
23 | logger.debug("get_content_from_url", extra_data({"url": url}))
24 | response = requests.get(url, timeout=TIMEOUT_SECONDS)
25 | if response.status_code >= 200 and response.status_code < 300:
26 | soup = BeautifulSoup(response.text, "html.parser")
27 | content = soup.get_text(separator="\n", strip=True)
28 | if max_length and len(content) > max_length:
29 | return content[:max_length]
30 | else:
31 | return content
32 | else:
33 | return f"Error retrieving content from URL: `{response.status_code}`."
34 | except requests.Timeout:
35 | return f"Error retrieving content from URL: `Timeout` after {TIMEOUT_SECONDS} seconds."
36 | except Exception as e:
37 | return f"Error retrieving content from URL: `{e}`."
38 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/coding_master/system.md:
--------------------------------------------------------------------------------
```markdown
1 | **Expert coder**
2 |
3 |
4 |
5 | You are an expert in understanding and digesting computer coding and computer languages.
6 | Explain the concept of [insert specific coding concept or language here] as if you
7 | were teaching it to a beginner. Use examples from reputable sources like Codeacademy (codeacademy.com) and NetworkChuck to illustrate your points.
8 |
9 |
10 |
11 |
12 | **Coding output**
13 |
14 | Please format the code in a markdown method using syntax
15 |
16 | also please illustrate the code in this format:
17 |
18 | ``` your code
19 | Your code here
20 | ```
21 |
22 |
23 |
24 | **OUTPUT INSTRUCTIONS**
25 | Only output Markdown.
26 |
27 | Write the IDEAS bullets as exactly 16 words.
28 |
29 | Write the RECOMMENDATIONS bullets as exactly 16 words.
30 |
31 | Write the HABITS bullets as exactly 16 words.
32 |
33 | Write the FACTS bullets as exactly 16 words.
34 |
35 | Write the INSIGHTS bullets as exactly 16 words.
36 |
37 | Extract at least 25 IDEAS from the content.
38 |
39 | Extract at least 10 INSIGHTS from the content.
40 |
41 | Extract at least 20 items for the other output sections.
42 |
43 | Do not give warnings or notes; only output the requested sections.
44 |
45 | You use bulleted lists for output, not numbered lists.
46 |
47 | Do not repeat ideas, quotes, facts, or resources.
48 |
49 | Do not start items with the same opening words.
50 |
51 | Ensure you follow ALL these instructions when creating your output.
52 |
53 | **INPUT**
54 | INPUT:
55 |
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/assistant/storage_models.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Models for knowledge transfer share storage entities.
3 |
4 | This module contains data models specific to storage operations,
5 | separate from the core share data models.
6 | """
7 |
8 | from datetime import datetime
9 | from enum import Enum
10 | from typing import List
11 |
12 | from pydantic import BaseModel, Field
13 |
14 |
15 | class ConversationRole(str, Enum):
16 | """
17 | Enumeration of conversation roles in a knowledge transfer.
18 |
19 | This enum represents the role that a conversation plays in a knowledge transfer,
20 | either as a Coordinator (managing the knowledge transfer) or as a Team member
21 | (participating in the knowledge transfer).
22 | """
23 |
24 | COORDINATOR = "coordinator"
25 | TEAM = "team"
26 |
27 |
28 | class CoordinatorConversationMessage(BaseModel):
29 | """Model for storing a message from Coordinator conversation for Team access."""
30 |
31 | message_id: str
32 | content: str
33 | sender_name: str
34 | timestamp: datetime = Field(default_factory=datetime.utcnow)
35 | is_assistant: bool = False
36 |
37 |
38 | class CoordinatorConversationStorage(BaseModel):
39 | """Model for storing a collection of Coordinator conversation messages."""
40 |
41 | knowledge_share_id: str
42 | last_updated: datetime = Field(default_factory=datetime.utcnow)
43 | messages: List[CoordinatorConversationMessage] = Field(default_factory=list)
44 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/extract_core_message/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY
2 |
3 | You are an expert at looking at a presentation, an essay, or a full body of lifetime work, and clearly and accurately articulating what the core message is.
4 |
5 | # GOAL
6 |
7 | - Produce a clear sentence that perfectly articulates the core message as presented in a given text or body of work.
8 |
9 | # EXAMPLE
10 |
11 | If the input is all of Victor Frankl's work, then the core message would be:
12 |
13 | Finding meaning in suffering is key to human resilience, purpose, and enduring life’s challenges.
14 |
15 | END EXAMPLE
16 |
17 | # STEPS
18 |
19 | - Fully digest the input.
20 |
21 | - Determine if the input is a single text or a body of work.
22 |
23 | - Based on which it is, parse the thing that's supposed to be parsed.
24 |
25 | - Extract the core message from the parsed text into a single sentence.
26 |
27 | # OUTPUT
28 |
29 | - Output a single, 15-word sentence that perfectly articulates the core message as presented in the input.
30 |
31 | # OUTPUT INSTRUCTIONS
32 |
33 | - The sentence should be a single sentence that is 16 words or fewer, with no special formatting or anything else.
34 |
35 | - Do not include any setup to the sentence, e.g., "The core message is to…", etc. Just list the core message and nothing else.
36 |
37 | - ONLY OUTPUT THE CORE MESSAGE, not a setup to it, commentary on it, or anything else.
38 |
39 | - Do not ask questions or complain in any way about the task.
40 |
```
--------------------------------------------------------------------------------
/examples/python/python-01-echo-bot/assistant/config.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Annotated
2 |
3 | from pydantic import BaseModel, Field
4 | from semantic_workbench_assistant.config import UISchema
5 |
6 | # The semantic workbench app uses react-jsonschema-form for rendering
7 | # dyanmic configuration forms based on the configuration model and UI schema
8 | # See: https://rjsf-team.github.io/react-jsonschema-form/docs/
9 | # Playground / examples: https://rjsf-team.github.io/react-jsonschema-form/
10 |
11 | # The UI schema can be used to customize the appearance of the form. Use
12 | # the UISchema class to define the UI schema for specific fields in the
13 | # configuration model.
14 |
15 |
16 | # the workbench app builds dynamic forms based on the configuration model and UI schema
17 | class AssistantConfigModel(BaseModel):
18 | enable_debug_output: Annotated[
19 | bool,
20 | Field(
21 | title="Include Debug Output",
22 | description="Include debug output on conversation messages.",
23 | ),
24 | ] = False
25 |
26 | welcome_message: Annotated[
27 | str,
28 | Field(
29 | title="Welcome Message",
30 | description="The message to display when the conversation starts.",
31 | ),
32 | UISchema(
33 | widget="textarea",
34 | ),
35 | ] = "Hello! I am an echo example, I will repeat what you say."
36 |
37 | # add any additional configuration fields
38 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/App/AppMenu.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import { Button, Menu, MenuItem, MenuList, MenuPopover, MenuTrigger } from '@fluentui/react-components';
4 | import { MoreHorizontal24Regular, Settings24Regular, Share24Regular } from '@fluentui/react-icons';
5 | import React from 'react';
6 | import { useNavigate } from 'react-router-dom';
7 |
8 | export const AppMenu: React.FC = () => {
9 | const navigate = useNavigate();
10 |
11 | return (
12 | <Menu>
13 | <MenuTrigger disableButtonEnhancement>
14 | <Button icon={<MoreHorizontal24Regular />} />
15 | </MenuTrigger>
16 | <MenuPopover>
17 | <MenuList>
18 | <MenuItem
19 | icon={<Share24Regular />}
20 | onClick={() => {
21 | navigate('/shares');
22 | }}
23 | >
24 | Shares
25 | </MenuItem>
26 | <MenuItem
27 | icon={<Settings24Regular />}
28 | onClick={() => {
29 | navigate('/settings');
30 | }}
31 | >
32 | Settings
33 | </MenuItem>
34 | </MenuList>
35 | </MenuPopover>
36 | </Menu>
37 | );
38 | };
39 |
```
--------------------------------------------------------------------------------
/assistants/navigator-assistant/pyproject.toml:
--------------------------------------------------------------------------------
```toml
1 | [project]
2 | name = "navigator-assistant"
3 | version = "0.1.0"
4 | description = "A python Semantic Workbench OpenAI assistant for navigating the workbench and assistants."
5 | authors = [{ name = "Semantic Workbench Team" }]
6 | readme = "README.md"
7 | requires-python = ">=3.11,<3.13"
8 | dependencies = [
9 | "assistant-drive>=0.1.0",
10 | "assistant-extensions[attachments, mcp]>=0.1.0",
11 | "mcp-extensions[openai]>=0.1.0",
12 | "content-safety>=0.1.0",
13 | "deepmerge>=2.0",
14 | "openai>=1.61.0",
15 | "openai-client>=0.1.0",
16 | "tiktoken>=0.8.0",
17 | ]
18 |
19 | [tool.hatch.build.targets.wheel]
20 | packages = ["assistant"]
21 |
22 | [tool.uv]
23 | package = true
24 |
25 | [tool.uv.sources]
26 | anthropic-client = { path = "../../libraries/python/anthropic-client", editable = true }
27 | assistant-drive = { path = "../../libraries/python/assistant-drive", editable = true }
28 | assistant-extensions = { path = "../../libraries/python/assistant-extensions", editable = true }
29 | mcp-extensions = { path = "../../libraries/python/mcp-extensions", editable = true }
30 | content-safety = { path = "../../libraries/python/content-safety/", editable = true }
31 | openai-client = { path = "../../libraries/python/openai-client", editable = true }
32 |
33 | [build-system]
34 | requires = ["hatchling"]
35 | build-backend = "hatchling.build"
36 |
37 | [dependency-groups]
38 | dev = ["pyright>=1.1.389"]
39 |
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-giphy/mcp_server/server.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Optional
2 |
3 | from mcp.server.fastmcp import Context, FastMCP
4 |
5 | from .config import settings
6 | from .giphy_search import perform_search
7 |
8 | # Set the name of the MCP server
9 | server_name = "GIPHY MCP Server"
10 |
11 |
12 | def create_mcp_server() -> FastMCP:
13 | # Initialize FastMCP with debug logging.
14 | mcp = FastMCP(name=server_name, log_level=settings.log_level)
15 |
16 | @mcp.tool()
17 | async def giphy_search(context: str, search_term: str, ctx: Context) -> Optional[dict]:
18 | """
19 | A specialized team member that searches the GIPHY database for GIFs based on your search term.
20 | Use them to find the perfect GIF to express your thoughts or feelings. Provide as much context
21 | as possible to help them understand the context of your search. Your search term should be a
22 | specific keyword or phrase that describes the GIF you're looking for. For context, pass as
23 | much background as you can: if using this tool in a conversation, include the conversation
24 | history; if in a broader context, include any relevant documents or details. If there is no
25 | context, pass “None.”
26 | """
27 |
28 | # Perform search using context and search term
29 | return await perform_search(context=context, search_term=search_term, ctx=ctx)
30 |
31 | return mcp
32 |
```
--------------------------------------------------------------------------------
/libraries/python/semantic-workbench-assistant/pyproject.toml:
--------------------------------------------------------------------------------
```toml
1 | [project]
2 | name = "semantic-workbench-assistant"
3 | version = "0.1.0"
4 | description = "Library for facilitating the implementation of FastAPI-based Semantic Workbench assistants."
5 | authors = [{ name = "Semantic Workbench Team" }]
6 | readme = "README.md"
7 | requires-python = ">=3.11"
8 | dependencies = [
9 | "asgi-correlation-id>=4.3.1",
10 | "backoff>=2.2.1",
11 | "fastapi[standard]~=0.115.0",
12 | "pydantic-settings>=2.2.0",
13 | "python-json-logger>=2.0.7",
14 | "rich>=13.7.0",
15 | "deepmerge>=2.0",
16 | "semantic-workbench-api-model>=0.1.0",
17 | ]
18 |
19 | [dependency-groups]
20 | dev = [
21 | "asgi-lifespan>=2.1.0",
22 | "pyright>=1.1.389",
23 | "pytest>=7.4.3",
24 | "pytest-asyncio>=0.23.5.post1",
25 | "pytest-httpx>=0.30.0",
26 | ]
27 |
28 | [tool.uv.sources]
29 | semantic-workbench-api-model = { path = "../semantic-workbench-api-model", editable = true }
30 |
31 | [project.scripts]
32 | start-semantic-workbench-assistant = "semantic_workbench_assistant.start:main"
33 | start-assistant = "semantic_workbench_assistant.start:main"
34 |
35 | [build-system]
36 | requires = ["hatchling"]
37 | build-backend = "hatchling.build"
38 |
39 | [tool.pytest.ini_options]
40 | addopts = "-vv"
41 | log_cli = true
42 | log_cli_level = "WARNING"
43 | log_cli_format = "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s"
44 | testpaths = ["tests"]
45 | asyncio_mode = "auto"
46 | asyncio_default_fixture_loop_scope = "function"
47 |
```
--------------------------------------------------------------------------------
/libraries/python/mcp-extensions/mcp_extensions/__init__.py:
--------------------------------------------------------------------------------
```python
1 | from ._client_session import (
2 | ExtendedClientSession,
3 | ListResourcesFnT,
4 | ReadResourceFnT,
5 | WriteResourceFnT,
6 | WriteResourceRequest,
7 | WriteResourceRequestParams,
8 | WriteResourceResult,
9 | )
10 | from ._model import ServerNotificationHandler, ToolCallFunction, ToolCallProgressMessage
11 | from ._sampling import send_sampling_request
12 | from ._server_extensions import list_client_resources, read_client_resource, write_client_resource
13 | from ._tool_utils import (
14 | convert_tools_to_openai_tools,
15 | execute_tool_with_retries,
16 | send_tool_call_progress,
17 | )
18 |
19 | # Exported utilities and models for external use.
20 | # These components enhance interactions with MCP workflows by providing utilities for notifications,
21 | # progress updates, and tool conversion specific to the MCP ecosystem.
22 | __all__ = [
23 | "convert_tools_to_openai_tools",
24 | "execute_tool_with_retries",
25 | "list_client_resources",
26 | "read_client_resource",
27 | "write_client_resource",
28 | "send_sampling_request",
29 | "send_tool_call_progress",
30 | "ServerNotificationHandler",
31 | "ToolCallFunction",
32 | "ToolCallProgressMessage",
33 | "ExtendedClientSession",
34 | "ListResourcesFnT",
35 | "ReadResourceFnT",
36 | "WriteResourceFnT",
37 | "WriteResourceRequest",
38 | "WriteResourceRequestParams",
39 | "WriteResourceResult",
40 | ]
41 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/docs/vs-recipe-tool.md:
--------------------------------------------------------------------------------
```markdown
1 | # Comparison
2 |
3 | ## Comparing implementations
4 |
5 | ### Recipe Executor
6 |
7 | - All input/output through context dict and files. Context mutation is opaque and buried in each step.
8 | - Program flow through state machine flow diagram written in JSON. No Python available. Each step encodes its own.
9 | - Sub-recipes through `execute_recipe` step.
10 | - Control flow including `Loop` and `Conditional` steps.
11 | - Packages recipes in sets (directories).
12 | - No stack for running recipes (but one could be introduced to "see" where we are in control flow)
13 | - "ask" handled by writing to files (how does resume work?)
14 | - Interacts with the filesystem directly.
15 | - Misc
16 | - More directly focused on driving LLMs. Includes tools for handling prompts and prompt context.
17 |
18 | ### Routine Library
19 |
20 | - Input/output through python args. Transparent.
21 | - Program flow through program written in Python. All non-external functions are available. No separate "steps".
22 | - Subroutines through `run` function.
23 | - Control flow using Python.
24 | - Packages routines in skills (dynamically-loaded Python packages)
25 | - A stack for running subroutines with variable scope (vs. a general context bucket).
26 | - "ask" handled by pausing control flow, resumes with answer
27 | - uses `Drive` for interacting with the filesystem.
28 | - Misc
29 | - Focused on routines. LLM-agnostic.
30 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/check_agreement/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You are an expert at analyzing contracts and agreements and looking for gotchas. You take a document in and output a Markdown formatted summary using the format below.
4 |
5 | Take a deep breath and think step by step about how to best accomplish this goal using the following steps.
6 |
7 | # OUTPUT SECTIONS
8 |
9 | - Combine all of your understanding of the content into a single, 30-word sentence in a section called DOCUMENT SUMMARY:.
10 |
11 | - Output the 10 most important aspects, stipulations, and other types of gotchas in the content as a list with no more than 20 words per point into a section called CALLOUTS:.
12 |
13 | - Output the 10 most important issues to be aware of before agreeing to the document, organized in three sections: CRITICAL:, IMPORTANT:, and OTHER:.
14 |
15 | - For each of the CRITICAL and IMPORTANT items identified, write a request to be sent to the sending organization recommending it be changed or removed. Place this in a section called RESPONSES:.
16 |
17 | # OUTPUT INSTRUCTIONS
18 |
19 | - Create the output using the formatting above.
20 | - You only output human readable Markdown.
21 | - Output numbered lists, not bullets.
22 | - Do not output warnings or notes—just the requested sections.
23 | - Do not repeat items in the output sections.
24 | - Do not start items with the same opening words.
25 |
26 | # INPUT:
27 |
28 | INPUT:
29 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/recommend_artists/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY
2 |
3 | You are an EDM expert who specializes in identifying artists that I will like based on the input of a list of artists at a festival. You output a list of artists and a proposed schedule based on the input of set times and artists.
4 |
5 | # GOAL
6 |
7 | - Recommend the perfect list of people and schedule to see at a festival that I'm most likely to enjoy.
8 |
9 | # STEPS
10 |
11 | - Look at the whole list of artists.
12 |
13 | - Look at my list of favorite styles and artists below.
14 |
15 | - Recommend similar artists, and the reason you think I will like them.
16 |
17 | # MY FAVORITE STYLES AND ARTISTS
18 |
19 | ### Styles
20 |
21 | - Dark menacing techno
22 | - Hard techno
23 | - Intricate minimal techno
24 | - Hardstyle that sounds dangerous
25 |
26 | ### Artists
27 |
28 | - Sarah Landry
29 | - Fisher
30 | - Boris Brejcha
31 | - Technoboy
32 |
33 | - Optimize your selections based on how much I'll love the artists, not anything else.
34 |
35 | - If the artist themselves are playing, make sure you have them on the schedule.
36 |
37 | # OUTPUT
38 |
39 | - Output a schedule of where to be and when based on the best matched artists, along with the explanation of why them.
40 |
41 | - Organize the output format by day, set time, then stage, then artist.
42 |
43 | - Optimize your selections based on how much I'll love the artists, not anything else.
44 |
45 | - Output in Markdown, but make it easy to read in text form, so no asterisks, bold or italic.
46 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/ContentRenderers/CodeContentRenderer.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import { makeStyles, tokens } from '@fluentui/react-components';
4 | import React from 'react';
5 | import SyntaxHighlighter from 'react-syntax-highlighter';
6 | import { stackoverflowLight as syntaxHighlighterStyle } from 'react-syntax-highlighter/dist/esm/styles/hljs';
7 | import { CopyButton } from '../../App/CopyButton';
8 |
9 | const useClasses = makeStyles({
10 | root: {
11 | position: 'relative',
12 | },
13 | copy: {
14 | position: 'absolute',
15 | right: tokens.spacingHorizontalXS,
16 | top: tokens.spacingVerticalXS,
17 | },
18 | });
19 |
20 | interface CodeContentRendererProps {
21 | content: string;
22 | language: string;
23 | }
24 |
25 | export const CodeContentRenderer: React.FC<CodeContentRendererProps> = (props) => {
26 | const { content, language } = props;
27 | const classes = useClasses();
28 |
29 | return (
30 | <div className={classes.root}>
31 | <div className={classes.copy}>
32 | <CopyButton data={content}></CopyButton>
33 | </div>
34 | <SyntaxHighlighter
35 | PreTag="div"
36 | language={language}
37 | style={syntaxHighlighterStyle}
38 | wrapLongLines
39 | // eslint-disable-next-line react/no-children-prop
40 | children={content}
41 | />
42 | </div>
43 | );
44 | };
45 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/ConversationsImport.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import React from 'react';
4 | import { useWorkbenchService } from '../../libs/useWorkbenchService';
5 | import { ContentImport } from '../App/ContentImport';
6 |
7 | interface ConversationsImportProps {
8 | disabled?: boolean;
9 | iconOnly?: boolean;
10 | asToolbarButton?: boolean;
11 | appearance?: 'primary' | 'secondary' | 'outline' | 'subtle' | 'transparent';
12 | size?: 'small' | 'medium' | 'large';
13 | onImport?: (conversationIds: string[]) => void;
14 | onError?: (error: Error) => void;
15 | }
16 |
17 | export const ConversationsImport: React.FC<ConversationsImportProps> = (props) => {
18 | const { disabled, iconOnly, asToolbarButton, appearance, size, onImport, onError } = props;
19 | const workbenchService = useWorkbenchService();
20 |
21 | const importFile = async (file: File) => {
22 | const result = await workbenchService.importConversationsAsync(file);
23 | return result.conversationIds;
24 | };
25 |
26 | return (
27 | <ContentImport
28 | contentTypeLabel="conversations"
29 | importFunction={importFile}
30 | onImport={onImport}
31 | onError={onError}
32 | disabled={disabled}
33 | iconOnly={iconOnly}
34 | asToolbarButton={asToolbarButton}
35 | appearance={appearance}
36 | size={size}
37 | />
38 | );
39 | };
40 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/extract_sponsors/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You are an expert at extracting the sponsors and potential sponsors from a given transcript, such a from a podcast, video transcript, essay, or whatever.
4 |
5 | # Steps
6 |
7 | - Consume the whole transcript so you understand what is content, what is meta information, etc.
8 |
9 | - Discern the difference between companies that were mentioned and companies that actually sponsored the podcast or video.
10 |
11 | - Output the following:
12 |
13 | ## OFFICIAL SPONSORS
14 |
15 | - $SOURCE_CHANNEL$ | $SPONSOR1$ | $SPONSOR1_DESCRIPTION$ | $SPONSOR1_LINK$
16 | - $SOURCE_CHANNEL$ | $SPONSOR2$ | $SPONSOR2_DESCRIPTION$ | $SPONSOR2_LINK$
17 | - $SOURCE_CHANNEL$ | $SPONSOR3$ | $SPONSOR3_DESCRIPTION$ | $SPONSOR3_LINK$
18 | - And so on…
19 |
20 | # EXAMPLE OUTPUT
21 |
22 | ## OFFICIAL SPONSORS
23 |
24 | - Flair | Flair is a threat intel platform powered by AI. | https://flair.ai
25 | - Weaviate | Weviate is an open-source knowledge graph powered by ML. | https://weaviate.com
26 | - JunaAI | JunaAI is a platform for AI-powered content creation. | https://junaai.com
27 | - JunaAI | JunaAI is a platform for AI-powered content creation. | https://junaai.com
28 |
29 | ## END EXAMPLE OUTPUT
30 |
31 | # OUTPUT INSTRUCTIONS
32 |
33 | - The official sponsor list should only include companies that officially sponsored the content in question.
34 | - Do not output warnings or notes—just the requested sections.
35 |
36 | # INPUT:
37 |
38 | INPUT:
39 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/solve_with_cot/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY
2 |
3 | You are an AI assistant designed to provide detailed, step-by-step responses. Your outputs should follow this structure:
4 |
5 | # STEPS
6 |
7 | 1. Begin with a <thinking> section.
8 |
9 | 2. Inside the thinking section:
10 |
11 | - a. Briefly analyze the question and outline your approach.
12 |
13 | - b. Present a clear plan of steps to solve the problem.
14 |
15 | - c. Use a "Chain of Thought" reasoning process if necessary, breaking down your thought process into numbered steps.
16 |
17 | 3. Include a <reflection> section for each idea where you:
18 |
19 | - a. Review your reasoning.
20 |
21 | - b. Check for potential errors or oversights.
22 |
23 | - c. Confirm or adjust your conclusion if necessary.
24 | - Be sure to close all reflection sections.
25 | - Close the thinking section with </thinking>.
26 | - Provide your final answer in an <output> section.
27 |
28 | Always use these tags in your responses. Be thorough in your explanations, showing each step of your reasoning process.
29 | Aim to be precise and logical in your approach, and don't hesitate to break down complex problems into simpler components.
30 | Your tone should be analytical and slightly formal, focusing on clear communication of your thought process.
31 | Remember: Both <thinking> and <reflection> MUST be tags and must be closed at their conclusion.
32 | Make sure all <tags> are on separate lines with no other text.
33 |
34 | # INPUT
35 |
36 | INPUT:
37 |
```
--------------------------------------------------------------------------------
/aspire-orchestrator/Aspire.Extensions/DockerFileExtensions.cs:
--------------------------------------------------------------------------------
```csharp
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | namespace Aspire.Hosting;
4 |
5 | public static class DockerFileExtensions
6 | {
7 | public static IResourceBuilder<ExecutableResource> PublishAsDockerImage(this IResourceBuilder<ExecutableResource> builder,
8 | string? dockerContext = null,
9 | string? dockerFilePath = "Dockerfile",
10 | Action<IResourceBuilder<ContainerResource>>? configure = null)
11 | {
12 | if (!builder.ApplicationBuilder.ExecutionContext.IsPublishMode)
13 | {
14 | return builder;
15 | }
16 |
17 | // Bait and switch the ExecutableResource with a ContainerResource
18 | builder.ApplicationBuilder.Resources.Remove(builder.Resource);
19 |
20 | var container = new ExecutableContainerResource(builder.Resource);
21 | var cb = builder.ApplicationBuilder.AddResource(container);
22 | cb.WithImage(builder.Resource.Name);
23 | cb.WithDockerfile(contextPath: dockerContext ?? builder.Resource.WorkingDirectory, dockerfilePath: dockerFilePath);
24 | // Clear the runtime args
25 | cb.WithArgs(c => c.Args.Clear());
26 |
27 | configure?.Invoke(cb);
28 |
29 | return builder;
30 | }
31 |
32 | private sealed class ExecutableContainerResource(ExecutableResource er) : ContainerResource(er.Name)
33 | {
34 | public override ResourceAnnotationCollection Annotations => er.Annotations;
35 | }
36 | }
37 |
```
--------------------------------------------------------------------------------
/libraries/python/mcp-extensions/mcp_extensions/llm/chat_completion.py:
--------------------------------------------------------------------------------
```python
1 | # Copyright (c) Microsoft. All rights reserved.
2 |
3 | from typing import Any, Callable
4 |
5 | from mcp.server.fastmcp import Context
6 |
7 | from mcp_extensions.llm.llm_types import ChatCompletionRequest, ChatCompletionResponse
8 | from mcp_extensions.llm.mcp_chat_completion import mcp_chat_completion
9 | from mcp_extensions.llm.openai_chat_completion import openai_chat_completion
10 |
11 |
12 | async def chat_completion(
13 | request: ChatCompletionRequest,
14 | provider: str,
15 | client: Callable[..., Any] | Context,
16 | ) -> ChatCompletionResponse:
17 | """Get a chat completion response from the given provider. Currently supported providers:
18 | - `azure_openai` - Azure OpenAI
19 | - `mcp` - MCP Sampling
20 |
21 | Args:
22 | request: Request parameter object
23 | provider: The supported provider name
24 | client: Client information, see the provider's implementation for what can be provided
25 |
26 | Returns:
27 | ChatCompletionResponse: The chat completion response.
28 | """
29 | if (provider == "openai" or provider == "azure_openai" or provider == "dev") and isinstance(client, Callable):
30 | return openai_chat_completion(request, client)
31 | elif provider == "mcp" and isinstance(client, Context):
32 | return await mcp_chat_completion(request, client)
33 | else:
34 | raise ValueError(f"Provider {provider} not supported or client is of the wrong type")
35 |
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/pyproject.toml:
--------------------------------------------------------------------------------
```toml
1 | [project]
2 | name = "assistant"
3 | version = "0.1.0"
4 | description = "A file-sharing mediator assistant for collaborative projects."
5 | authors = [{ name = "Semantic Workbench Team" }]
6 | readme = "README.md"
7 | requires-python = ">=3.11"
8 | dependencies = [
9 | "assistant-extensions[attachments]>=0.1.0",
10 | "content-safety>=0.1.0",
11 | "openai>=1.61.0",
12 | "openai-client>=0.1.0",
13 | "semantic-workbench-assistant>=0.1.0",
14 | ]
15 |
16 | [dependency-groups]
17 | dev = [
18 | "pytest>=8.3.1",
19 | "pytest-asyncio>=0.23.8",
20 | "pytest-repeat>=0.9.3",
21 | "pyright>=1.1.389",
22 | ]
23 |
24 | [tool.uv]
25 | package = true
26 |
27 | [tool.uv.sources]
28 | assistant-extensions = { path = "../../libraries/python/assistant-extensions", editable = true }
29 | content-safety = { path = "../../libraries/python/content-safety/", editable = true }
30 | openai-client = { path = "../../libraries/python/openai-client", editable = true }
31 | semantic-workbench-assistant = { path = "../../libraries/python/semantic-workbench-assistant", editable = true }
32 |
33 | [build-system]
34 | requires = ["hatchling"]
35 | build-backend = "hatchling.build"
36 |
37 | [tool.pyright]
38 | exclude = ["**/.venv", "**/.data", "**/__pycache__"]
39 |
40 | [tool.pytest.ini_options]
41 | addopts = "-vv"
42 | log_cli = true
43 | log_cli_level = "WARNING"
44 | log_cli_format = "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s"
45 | asyncio_mode = "auto"
46 | asyncio_default_fixture_loop_scope = "function"
47 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/FrontDoor/GlobalContent.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import { makeStyles, shorthands, tokens } from '@fluentui/react-components';
4 | import React from 'react';
5 | import { ConversationList } from './Controls/ConversationList';
6 |
7 | const useClasses = makeStyles({
8 | root: {
9 | flex: '1 1 auto',
10 | display: 'flex',
11 | flexDirection: 'column',
12 | height: '100vh',
13 | },
14 | header: {
15 | flex: '0 0 auto',
16 | display: 'flex',
17 | flexDirection: 'row',
18 | alignItems: 'center',
19 | justifyContent: 'space-between',
20 | ...shorthands.padding(tokens.spacingVerticalS, tokens.spacingHorizontalM),
21 | },
22 | content: {
23 | flex: '1 1 auto',
24 | overflow: 'auto',
25 | },
26 | });
27 |
28 | interface GlobalContentProps {
29 | headerBefore?: React.ReactNode;
30 | headerAfter?: React.ReactNode;
31 | }
32 |
33 | export const GlobalContent: React.FC<GlobalContentProps> = (props) => {
34 | const { headerBefore, headerAfter } = props;
35 | const classes = useClasses();
36 |
37 | const conversationList = React.useMemo(() => <ConversationList hideChildConversations />, []);
38 |
39 | return (
40 | <div className={classes.root}>
41 | <div className={classes.header}>
42 | {headerBefore}
43 | {headerAfter}
44 | </div>
45 | <div className={classes.content}>{conversationList}</div>
46 | </div>
47 | );
48 | };
49 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/extract_ideas/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You are an advanced AI with a 2,128 IQ and you are an expert in understanding any input and extracting the most important ideas from it.
4 |
5 | # STEPS
6 |
7 | 1. Spend 319 hours fully digesting the input provided.
8 |
9 | 2. Spend 219 hours creating a mental map of all the different ideas and facts and references made in the input, and create yourself a giant graph of all the connections between them. E.g., Idea1 --> Is the Parent of --> Idea2. Concept3 --> Came from --> Socrates. Etc. And do that for every single thing mentioned in the input.
10 |
11 | 3. Write that graph down on a giant virtual whiteboard in your mind.
12 |
13 | 4. Now, using that graph on the virtual whiteboard, extract all of the ideas from the content in 15-word bullet points.
14 |
15 | # OUTPUT
16 |
17 | - Output the FULL list of ideas from the content in a section called IDEAS
18 |
19 | # EXAMPLE OUTPUT
20 |
21 | IDEAS
22 |
23 | - The purpose of life is to find meaning and fulfillment in our existence.
24 | - Business advice is too confusing for the average person to understand and apply.
25 | - (continued)
26 |
27 | END EXAMPLE OUTPUT
28 |
29 | # OUTPUT INSTRUCTIONS
30 |
31 | - Only output Markdown.
32 | - Do not give warnings or notes; only output the requested sections.
33 | - Do not omit any ideas
34 | - Do not repeat ideas
35 | - Do not start items with the same opening words.
36 | - Ensure you follow ALL these instructions when creating your output.
37 |
38 | # INPUT
39 |
40 | INPUT:
41 |
42 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/tests/utilities/test_parse_command_string.py:
--------------------------------------------------------------------------------
```python
1 | from skill_library.utilities import parse_command_string
2 |
3 |
4 | def test_parse_command_string():
5 | command, args, kwargs = parse_command_string(
6 | 'command(arg1, arg2, key1="val1", key2=True, key3=3, key4 = 3+2, key5=[1,2], key6=(1,2), key7={"a": 1, "b": 2})'
7 | )
8 | assert command == "command"
9 | assert args == ("arg1", "arg2")
10 | assert kwargs == {
11 | "key1": "val1",
12 | "key2": True,
13 | "key3": 3,
14 | "key4": 5,
15 | "key5": [1, 2],
16 | "key6": (1, 2),
17 | "key7": {"a": 1, "b": 2},
18 | }
19 |
20 |
21 | def test_parse_command_string_no_args():
22 | command, args, kwargs = parse_command_string('command(key1="val1", key2="val2")')
23 | assert command == "command"
24 | assert args == ()
25 | assert kwargs == {"key1": "val1", "key2": "val2"}
26 |
27 |
28 | def test_parse_command_string_no_kwargs():
29 | command, args, kwargs = parse_command_string("command(arg1, arg2)")
30 | assert command == "command"
31 | assert args == ("arg1", "arg2")
32 | assert kwargs == {}
33 |
34 |
35 | def test_parse_command_string_no_args_or_kwargs():
36 | command, args, kwargs = parse_command_string("command()")
37 | assert command == "command"
38 | assert args == ()
39 | assert kwargs == {}
40 |
41 |
42 | def test_parse_command_string_no_parens():
43 | command, args, kwargs = parse_command_string("command")
44 | assert command == "command"
45 | assert args == ()
46 | assert kwargs == {}
47 |
```