This is page 22 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
--------------------------------------------------------------------------------
/.github/workflows/assistants-document-assistant.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: document-assistant continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "assistants/document-assistant/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/assistants-document-assistant.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "assistants/document-assistant/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/assistants-document-assistant.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: assistants/document-assistant
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/.github/workflows/assistants-explorer-assistant.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: explorer-assistant continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "assistants/explorer-assistant/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/assistants-explorer-assistant.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "assistants/explorer-assistant/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/assistants-explorer-assistant.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: assistants/explorer-assistant
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/assistants/project-assistant/assistant/text_includes/update_knowledge_digest.md:
--------------------------------------------------------------------------------
```markdown
1 | You, the assistant, maintain a "knowledge digest". Based on the last chat message, it is time to consider updating your knowledge digest.
2 |
3 | ## What the knowledge digest is
4 |
5 | - The knowledge digest contains an outline of the knowledge contained within a knowledge share. It is not a summary, but an organized projection of all knowledge added to the packet from the coordinator's conversation and attachments.
6 | - The digest has a high information density. The digest contains no filler words or unnecessary content.
7 | - The digest includes all relevant information from the chat history: questions and answers, key concepts, decisions made during the knowledge transfer process, links, codes, and specific facts.
8 | - This digest is the primary resource of information for the audience and should help satisfy all audience takeaways.
9 |
10 | ## What the knowledge digest is NOT
11 |
12 | - The knowledge digest is NOT a place for planning.
13 | - The knowledge digest is NOT a place to keep track of the audience.
14 | - The knowledge digest is NOT a place to keep track of learning objectives.
15 |
16 | ## Knowledge digest instructions
17 |
18 | - If the knowledge digest does not need to be updated, just return <OK_AS_IS/>
19 | - Provide updated content based upon information extracted from the last message in the chat history.
20 | - Maintain an accessible knowledge reference that helps others understand the shared information.
21 | - Organize facts and concepts.
22 | - Maintain an outline of the content at all times. If the latest message suggests a new or expanded outline, update the existing outline to reflect the new content.
23 | - Do NOT supplement the digest with your own information.
24 | - Use brief, clear explanations of complex topics.
25 | - Remove information that is no longer relevant.
26 | - Do not use the digest for keeping track of tasks.
27 | - Do not include objectives and outcomes in the knowledge digest. They are maintained separately.
28 | - It's OK to leave the knowledge digest blank if there's nothing important to capture.
29 | - Your output format must be: <KNOWLEDGE_DIGEST>{content}</KNOWLEDGE_DIGEST> if you have updated content, or <OK_AS_IS/> if no changes need to be made.
30 |
```
--------------------------------------------------------------------------------
/.github/workflows/assistants-codespace-assistant.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: codespace-assistant continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "assistants/codespace-assistant/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/assistants-codespace-assistant.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "assistants/codespace-assistant/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/assistants-codespace-assistant.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: assistants/codespace-assistant
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/.github/workflows/assistants-navigator-assistant.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: navigator-assistant continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "assistants/navigator-assistant/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/assistants-navigator-assistant.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "assistants/navigator-assistant/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/assistants-navigator-assistant.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: assistants/navigator-assistant
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/examples/dotnet/dotnet-03-simple-chatbot/MyWorkbenchConnector.cs:
--------------------------------------------------------------------------------
```csharp
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | using System.Text.Json;
4 | using Microsoft.AspNetCore.Hosting.Server;
5 | using Microsoft.Extensions.Logging.Abstractions;
6 | using Microsoft.SemanticWorkbench.Connector;
7 |
8 | namespace AgentExample;
9 |
10 | internal sealed class MyWorkbenchConnector : WorkbenchConnector<MyAgentConfig>
11 | {
12 | private readonly IServiceProvider _sp;
13 | private readonly IConfiguration _appConfig;
14 |
15 | public MyWorkbenchConnector(
16 | IServiceProvider sp,
17 | IConfiguration appConfig,
18 | IAgentServiceStorage storage,
19 | IServer httpServer,
20 | ILoggerFactory? loggerFactory = null)
21 | : base(
22 | workbenchConfig: appConfig.GetSection("Workbench").Get<WorkbenchConfig>(),
23 | defaultAgentConfig: appConfig.GetSection("Agent").Get<MyAgentConfig>(),
24 | storage: storage,
25 | httpServer: httpServer,
26 | logger: loggerFactory?.CreateLogger<MyWorkbenchConnector>() ?? new NullLogger<MyWorkbenchConnector>())
27 | {
28 | this._sp = sp;
29 | this._appConfig = appConfig;
30 | }
31 |
32 | /// <inheritdoc />
33 | public override async Task CreateAgentAsync(
34 | string agentId,
35 | string? name,
36 | object? configData,
37 | CancellationToken cancellationToken = default)
38 | {
39 | if (this.GetAgent(agentId) != null) { return; }
40 |
41 | this.Log.LogDebug("Creating agent '{0}'", agentId);
42 |
43 | MyAgentConfig config = this.DefaultAgentConfig;
44 | if (configData != null)
45 | {
46 | var newCfg = JsonSerializer.Deserialize<MyAgentConfig>(JsonSerializer.Serialize(configData));
47 | if (newCfg != null) { config = newCfg; }
48 | }
49 |
50 | // Instantiate using .NET Service Provider so that dependencies are automatically injected
51 | var agent = ActivatorUtilities.CreateInstance<MyAgent>(
52 | this._sp,
53 | agentId, // agentId
54 | name ?? agentId, // agentName
55 | config, // agentConfig
56 | this._appConfig // appConfig
57 | );
58 |
59 | await agent.StartAsync(cancellationToken).ConfigureAwait(false);
60 | this.Agents.TryAdd(agentId, agent);
61 | }
62 | }
63 |
```
--------------------------------------------------------------------------------
/.github/workflows/mcp-server-web-research.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: mcp-server-web-research continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "mcp-servers/mcp-server-web-research/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/mcp-server-web-research.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "mcp-servers/mcp-server-web-research/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/mcp-server-web-research.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: mcp-servers/mcp-server-web-research
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/.github/workflows/assistants-prospector-assistant.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: prospector-assistant continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "assistants/prospector-assistant/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/assistants-prospector-assistant.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "assistants/prospector-assistant/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/assistants-prospector-assistant.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: assistants/prospector-assistant
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/assistants/document-assistant/assistant/response/utils/tokens_tiktoken.py:
--------------------------------------------------------------------------------
```python
1 | # Copyright (c) Microsoft. All rights reserved.
2 |
3 | from collections.abc import Collection
4 | from typing import AbstractSet, Literal
5 |
6 | import tiktoken
7 |
8 |
9 | class TokenizerOpenAI:
10 | def __init__(
11 | self,
12 | model: str,
13 | allowed_special: Literal["all"] | AbstractSet[str] | None = None,
14 | disallowed_special: Literal["all"] | Collection[str] | None = None,
15 | ) -> None:
16 | self.model = model
17 | self.allowed_special = allowed_special
18 | self.disallowed_special = disallowed_special
19 |
20 | self._init_tokenizer(model, allowed_special, disallowed_special)
21 |
22 | def _init_tokenizer(
23 | self,
24 | model: str,
25 | allowed_special: Literal["all"] | AbstractSet[str] | None = None,
26 | disallowed_special: Literal["all"] | Collection[str] | None = None,
27 | ) -> None:
28 | try:
29 | self.encoding = tiktoken.encoding_for_model(model)
30 | except KeyError:
31 | default_encoding = "o200k_base"
32 | self.encoding = tiktoken.get_encoding(default_encoding)
33 |
34 | # Set defaults if not provided
35 | if not allowed_special:
36 | self.allowed_special = set()
37 | if not disallowed_special:
38 | self.disallowed_special = ()
39 |
40 | def num_tokens_in_str(self, text: str) -> int:
41 | return len(
42 | self.encoding.encode(
43 | text,
44 | allowed_special=self.allowed_special if self.allowed_special is not None else set(), # type: ignore
45 | disallowed_special=self.disallowed_special if self.disallowed_special is not None else (),
46 | )
47 | )
48 |
49 | def truncate_str(self, text: str, max_len: int) -> str:
50 | tokens = self.encoding.encode(
51 | text,
52 | allowed_special=self.allowed_special if self.allowed_special is not None else set(), # type: ignore
53 | disallowed_special=self.disallowed_special if self.disallowed_special is not None else (),
54 | )
55 | if len(tokens) > max_len:
56 | tokens = tokens[:max_len]
57 | truncated_text = self.encoding.decode(tokens)
58 | return truncated_text
59 | else:
60 | return text
61 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/transcribe_minutes/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY and PURPOSE
2 |
3 | You extract minutes from a transcribed meeting. You must identify all actionables mentioned in the meeting. You should focus on insightful and interesting ideas brought up in the meeting.
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 | - Fully digest the content provided.
10 |
11 | - Extract all actionables agreed upon within the meeting.
12 |
13 | - Extract any interesting ideas brought up in the meeting.
14 |
15 | - In a section called TITLE, write a 1 to 5 word title for the meeting.
16 |
17 | - In a section called MAIN IDEA, write a 15-word sentence that captures the main idea.
18 |
19 | - In a section called MINUTES, write 20 to 50 bullet points, highlighting of the most surprising, insightful, and/or interesting ideas that come up in the conversation. If there are less than 50 then collect all of them. Make sure you extract at least 20.
20 |
21 | - In a section called ACTIONABLES, write bullet points for ALL agreed actionable details. This includes cases where a speaker agrees to do or look into something. If there is a deadline mentioned, include it here.
22 |
23 | - In a section called DECISIONS, include all decisions made during the meeting, including the rationale behind each decision. Present them as bullet points.
24 |
25 | - In a section called CHALLENGES, identify and document any challenges or issues discussed during the meeting. Note any potential solutions or strategies proposed to address these challenges.
26 |
27 | - In a section called NEXT STEPS, outline the next steps and actions to be taken after the meeting.
28 |
29 | # OUTPUT INSTRUCTIONS
30 |
31 | - Only output Markdown.
32 | - Write MINUTES as exactly 16 words.
33 | - Write ACTIONABLES as exactly 16 words.
34 | - Write DECISIONS as exactly 16 words.
35 | - Write CHALLENGES as 2-3 sentences.
36 | - Write NEXT STEPS as 2-3 sentences.
37 | - Do not give warnings or notes; only output the requested sections.
38 | - Do not repeat ideas, quotes, facts, or resources.
39 | - You use bulleted lists for output, not numbered lists.
40 | - Do not start items with the same opening words.
41 | - Ensure you follow ALL these instructions when creating your output.
42 |
43 | # INPUT
44 |
45 | INPUT:
46 |
```
--------------------------------------------------------------------------------
/.github/workflows/mcp-server-memory-filesystem-edit.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: mcp-server-filesystem-edit continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "mcp-servers/mcp-server-filesystem-edit/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/mcp-server-filesystem-edit.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "mcp-servers/mcp-server-filesystem-edit/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/mcp-server-filesystem-edit.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: mcp-servers/mcp-server-filesystem-edit
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/.github/workflows/mcp-server-memory-user-bio.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: mcp-server-memory-user-bio continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "mcp-servers/mcp-server-memory-user-bio/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/mcp-server-memory-user-bio.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "mcp-servers/mcp-server-memory-user-bio/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/mcp-server-memory-user-bio.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: mcp-servers/mcp-server-memory-user-bio
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/mcp-servers/mcp-server-office/.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 | "[json]": {
14 | "editor.defaultFormatter": "esbenp.prettier-vscode",
15 | "editor.formatOnSave": true
16 | },
17 | "[jsonc]": {
18 | "editor.defaultFormatter": "esbenp.prettier-vscode",
19 | "editor.formatOnSave": true
20 | },
21 | "python.analysis.autoFormatStrings": true,
22 | "python.analysis.autoImportCompletions": true,
23 | "python.analysis.diagnosticMode": "workspace",
24 | "python.analysis.fixAll": ["source.unusedImports"],
25 | // Project specific paths
26 | "python.analysis.ignore": ["libs"],
27 | "python.analysis.inlayHints.functionReturnTypes": true,
28 | "python.analysis.typeCheckingMode": "standard",
29 | "python.defaultInterpreterPath": "${workspaceFolder}/.venv",
30 | "[python]": {
31 | "editor.defaultFormatter": "charliermarsh.ruff",
32 | "editor.formatOnSave": true,
33 | "editor.codeActionsOnSave": {
34 | "source.fixAll": "explicit",
35 | "source.organizeImports": "explicit",
36 | "source.formatDocument": "explicit"
37 | }
38 | },
39 | "ruff.nativeServer": "on",
40 | "search.exclude": {
41 | "**/.venv": true,
42 | "**/.data": true
43 | },
44 | // For use with optional extension: "streetsidesoftware.code-spell-checker"
45 | "cSpell.ignorePaths": [
46 | ".git",
47 | ".gitignore",
48 | ".vscode",
49 | ".venv",
50 | "node_modules",
51 | "package-lock.json",
52 | "pyproject.toml",
53 | "settings.json",
54 | "uv.lock"
55 | ],
56 | "cSpell.words": [
57 | "aoai",
58 | "AUTHTOKEN",
59 | "blockified",
60 | "blockify",
61 | "devtunnel",
62 | "distpath",
63 | "dotenv",
64 | "ERRORLEVEL",
65 | "evals",
66 | "fastmcp",
67 | "hiddenimports",
68 | "ngrok",
69 | "onefile",
70 | "pyinstaller",
71 | "pyngrok",
72 | "taskkill",
73 | "toplevel",
74 | "unblockified",
75 | "unblockify"
76 | ],
77 | // Python testing configuration
78 | "python.testing.pytestEnabled": true,
79 | "python.testing.unittestEnabled": false,
80 | "python.testing.pytestArgs": ["tests", "-s"]
81 | }
82 |
```
--------------------------------------------------------------------------------
/workbench-app/src/components/Conversations/Message/MessageFooter.tsx:
--------------------------------------------------------------------------------
```typescript
1 | // Copyright (c) Microsoft. All rights reserved.
2 |
3 | import { AiGeneratedDisclaimer } from '@fluentui-copilot/react-copilot';
4 | import { makeStyles, tokens } from '@fluentui/react-components';
5 | import React from 'react';
6 |
7 | import { ConversationMessage } from '../../../models/ConversationMessage';
8 |
9 | import { AttachmentSection } from './AttachmentSection';
10 |
11 | const useClasses = makeStyles({
12 | alignForUser: {
13 | justifyContent: 'flex-end',
14 | alignItems: 'flex-end',
15 | },
16 | footer: {
17 | display: 'flex',
18 | color: tokens.colorNeutralForeground3,
19 | flexDirection: 'row',
20 | gap: tokens.spacingHorizontalS,
21 | alignItems: 'center',
22 | },
23 | generated: {
24 | width: 'fit-content',
25 | marginTop: tokens.spacingVerticalS,
26 | },
27 | });
28 |
29 | interface MessageFooterProps {
30 | message: ConversationMessage;
31 | }
32 |
33 | export const MessageFooter: React.FC<MessageFooterProps> = (props) => {
34 | const { message } = props;
35 | const classes = useClasses();
36 |
37 | const attachments = React.useMemo(() => {
38 | if (message.filenames && message.filenames.length > 0) {
39 | return <AttachmentSection filenames={message.filenames} className={classes.alignForUser} />;
40 | }
41 | return null;
42 | }, [message.filenames, classes.alignForUser]);
43 |
44 | const footerContent = React.useMemo(() => {
45 | if (message.metadata?.['footer_items']) {
46 | const footerItemsArray = Array.isArray(message.metadata['footer_items'])
47 | ? message.metadata['footer_items']
48 | : [message.metadata['footer_items']];
49 | return (
50 | <div className={classes.footer}>
51 | {footerItemsArray.map((item) => (
52 | <AiGeneratedDisclaimer key={item} className={classes.generated}>
53 | {item}
54 | </AiGeneratedDisclaimer>
55 | ))}
56 | </div>
57 | );
58 | }
59 | return null;
60 | }, [message.metadata, classes.footer, classes.generated]);
61 |
62 | const footer = (
63 | <>
64 | {attachments}
65 | {footerContent}
66 | </>
67 | );
68 |
69 | return footer;
70 | };
71 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/fabric/patterns/recommend_talkpanel_topics/system.md:
--------------------------------------------------------------------------------
```markdown
1 | # IDENTITY
2 |
3 | You read a full input of a person and their goals and their interests and ideas, and you produce a clean set of proposed talks or panel talking points that they can send to a conference organizer.
4 |
5 | # GOALS
6 |
7 | - Create a clean output that can be sent directly to a conference organizer to book them for a talk or panel.
8 |
9 | # STEPS
10 |
11 | - Fully understand the context that you were given.
12 |
13 | - Brainstorm on everything that person is interested in and good at for 319 hours.
14 |
15 | - Come up with a list of talks or panel talking points that they could give at a conference.
16 |
17 | # OUTPUT
18 |
19 | - In a section called TALKS, output 3 bullets giving a talk title and abstract for each talk.
20 |
21 | EXAMPLE:
22 |
23 | - The Future of AI & Security: In this talk $name of person$ will discuss the future of AI and security from both an AI prediction standpoint, but also in terms of technical implementation for various platforms. Attendees will leave with a better understanding of how AI and security are deeply intertwined and how _________ sees them integrating.
24 |
25 | END EXAMPLE:
26 |
27 | - In a section called PANELS, output 3 bullets giving ideas for a panel topic, combined with the points they would want to bring up.
28 |
29 | EXAMPLE:
30 |
31 | - PANEL: How AI Will Empower Our Adversaries: In this panel, $names of the people$ will discuss how AI is being used by adversaries to gain an edge in various areas. They will discuss the implications of this and how we can better prepare for the future.
32 |
33 | Topics Daniel Miessler can speak on in this panel:
34 |
35 | - Attacker top talent is usually only 100 to 1000 people total
36 | - AI will soon be able to replicate much of their talent
37 | - This means we could be facing adversaries with thousands or tens of thousands of elite members
38 | - Now imagine that for propaganda campaigns, etc.
39 |
40 | Proposed Panel Questions:
41 |
42 | - What are some of the ways you're worried about attackers using AI?
43 | - What do you think will have the most impact for attackers, and why?
44 | - How will defenders respond? Is there a solution?
45 | - What do we see happening, world-wide, as a result of this change?
46 |
47 | END EXAMPLE:
48 |
49 | # OUTPUT INSTRUCTIONS
50 |
51 | - Output in valid Markdown, but don't use any asterisks.
52 |
```
--------------------------------------------------------------------------------
/assistants/project-assistant/assistant/domain/knowledge_brief_manager.py:
--------------------------------------------------------------------------------
```python
1 | from semantic_workbench_assistant.assistant_app import ConversationContext
2 |
3 | from assistant.data import InspectorTab, KnowledgeBrief, LogEntryType
4 | from assistant.notifications import Notifications
5 | from assistant.storage import ShareStorage
6 | from assistant.utils import get_current_user_id
7 |
8 | from .share_manager import ShareManager
9 |
10 |
11 | class KnowledgeBriefManager:
12 | """Manages knowledge brief operations."""
13 |
14 | @staticmethod
15 | async def get_knowledge_brief(
16 | context: ConversationContext,
17 | ) -> KnowledgeBrief | None:
18 | share_id = await ShareManager.get_share_id(context)
19 | return ShareStorage.read_knowledge_brief(share_id)
20 |
21 | @staticmethod
22 | async def update_knowledge_brief(
23 | context: ConversationContext,
24 | title: str,
25 | content: str,
26 | timeline: str | None = None,
27 | ) -> KnowledgeBrief:
28 | share_id = await ShareManager.get_share_id(context)
29 | current_user_id = await get_current_user_id(context)
30 |
31 | brief = KnowledgeBrief(
32 | title=title,
33 | content=content,
34 | timeline=timeline,
35 | created_by=current_user_id,
36 | updated_by=current_user_id,
37 | conversation_id=str(context.id),
38 | )
39 |
40 | ShareStorage.write_knowledge_brief(share_id, brief)
41 |
42 | # Check if this is a creation or an update
43 | existing_brief = ShareStorage.read_knowledge_brief(share_id)
44 | if existing_brief:
45 | # This is an update
46 | await ShareManager.log_share_event(
47 | context=context,
48 | entry_type=LogEntryType.BRIEFING_UPDATED.value,
49 | message=f"Updated brief: {title}",
50 | )
51 | else:
52 | # This is a creation
53 | await ShareManager.log_share_event(
54 | context=context,
55 | entry_type=LogEntryType.BRIEFING_CREATED.value,
56 | message=f"Created brief: {title}",
57 | )
58 |
59 | await Notifications.notify_all(context, share_id, "Knowledge brief has been updated", {"content": content})
60 | await Notifications.notify_all_state_update(context, [InspectorTab.BRIEF])
61 |
62 | return brief
63 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/.vscode/settings.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "editor.bracketPairColorization.enabled": true,
3 | "editor.codeActionsOnSave": {
4 | "source.fixAll": "always",
5 | "source.organizeImports": "always"
6 | },
7 | "editor.defaultFormatter": "esbenp.prettier-vscode",
8 | "editor.formatOnPaste": true,
9 | "editor.formatOnSave": true,
10 | "editor.formatOnType": true,
11 | "editor.guides.bracketPairs": "active",
12 | "files.eol": "\n",
13 | "files.trimTrailingWhitespace": true,
14 | "flake8.ignorePatterns": ["**/*.py"], // disable flake8 in favor of ruff
15 | "jupyter.debugJustMyCode": false,
16 | "python.analysis.autoFormatStrings": true,
17 | "python.analysis.autoImportCompletions": true,
18 | "python.analysis.diagnosticMode": "workspace",
19 | "python.analysis.fixAll": ["source.unusedImports"],
20 | "python.analysis.inlayHints.functionReturnTypes": true,
21 | "python.analysis.typeCheckingMode": "standard",
22 | "python.defaultInterpreterPath": "${workspaceFolder}/.venv",
23 | "python.testing.pytestEnabled": true,
24 | "search.exclude": {
25 | "**/.venv": true,
26 | "**/data": true
27 | },
28 | "[json]": {
29 | "editor.defaultFormatter": "esbenp.prettier-vscode",
30 | "editor.formatOnSave": true
31 | },
32 | "[jsonc]": {
33 | "editor.defaultFormatter": "esbenp.prettier-vscode",
34 | "editor.formatOnSave": true
35 | },
36 | "[python]": {
37 | "editor.defaultFormatter": "charliermarsh.ruff",
38 | "editor.formatOnSave": true,
39 | "editor.codeActionsOnSave": {
40 | "source.fixAll": "explicit",
41 | "source.unusedImports": "explicit",
42 | "source.organizeImports": "explicit",
43 | "source.formatDocument": "explicit"
44 | }
45 | },
46 | "ruff.nativeServer": "on",
47 | // For use with optional extension: "streetsidesoftware.code-spell-checker"
48 | "cSpell.ignorePaths": [
49 | ".venv",
50 | "node_modules",
51 | "package-lock.json",
52 | "settings.json",
53 | "uv.lock"
54 | ],
55 | "cSpell.words": [
56 | "addopts",
57 | "asctime",
58 | "asyncio",
59 | "dotenv",
60 | "httpx",
61 | "jsonschema",
62 | "levelname",
63 | "metadrive",
64 | "norecursedirs",
65 | "openai",
66 | "pydantic",
67 | "pypdf",
68 | "pyright",
69 | "pytest",
70 | "runtimes",
71 | "subdrive",
72 | "testpaths",
73 | "tiktoken"
74 | ],
75 | "python.testing.pytestArgs": ["skill_library"],
76 | "python.testing.unittestEnabled": false
77 | }
78 |
```
--------------------------------------------------------------------------------
/.github/workflows/mcp-server-memory-whiteboard.yml:
--------------------------------------------------------------------------------
```yaml
1 | name: mcp-server-memory-whiteboard continuous integration
2 |
3 | permissions:
4 | contents: read
5 | pull-requests: write
6 |
7 | on:
8 | pull_request:
9 | branches: ["main"]
10 | paths:
11 | - "mcp-servers/mcp-server-memory-whiteboard/**"
12 | - "libraries/python/**"
13 | - "tools/docker/**"
14 | - ".github/workflows/mcp-server-memory-whiteboard.yml"
15 |
16 | push:
17 | branches: ["main"]
18 | paths:
19 | - "mcp-servers/mcp-server-memory-whiteboard/**"
20 | - "libraries/python/**"
21 | - "tools/docker/**"
22 | - ".github/workflows/mcp-server-memory-whiteboard.yml"
23 |
24 | workflow_dispatch:
25 |
26 | defaults:
27 | run:
28 | working-directory: mcp-servers/mcp-server-memory-whiteboard
29 |
30 | jobs:
31 | test:
32 | runs-on: ubuntu-latest
33 | steps:
34 | - uses: actions/checkout@v4
35 |
36 | - name: Install uv
37 | uses: astral-sh/setup-uv@v3
38 |
39 | - name: Set up Python 3.11
40 | run: uv python install 3.11
41 |
42 | - name: test
43 | run: |
44 | make test
45 |
46 | build:
47 | runs-on: ubuntu-latest
48 | steps:
49 | - uses: actions/checkout@v4
50 |
51 | - name: docker-build
52 | run: |
53 | make docker-build
54 |
55 | deploy:
56 | runs-on: ubuntu-latest
57 | environment: production
58 | permissions:
59 | id-token: write # for OIDC login
60 | contents: read
61 | concurrency:
62 | group: ${{ github.workflow }}-${{ github.ref }}
63 | needs: [build, test]
64 | if: ${{ (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main' && vars.DEPLOYMENT_ENABLED == 'true' }}
65 | env:
66 | DOCKER_IMAGE_TAG: ${{ github.sha }}
67 | DOCKER_REGISTRY_NAME: ${{ secrets.AZURE_CONTAINER_REGISTRY_NAME }}
68 | AZURE_WEBSITE_RESOURCE_GROUP: ${{ secrets.AZURE_WEBSITE_RESOURCE_GROUP }}
69 | AZURE_WEBSITE_SUBSCRIPTION: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
70 |
71 | steps:
72 | - uses: actions/checkout@v4
73 |
74 | - uses: azure/login@v2
75 | with:
76 | client-id: ${{ secrets.AZURE_CLIENT_ID }}
77 | tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78 | subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79 |
80 | - name: docker-push
81 | run: |
82 | make docker-push
83 |
84 | - name: docker-deploy
85 | run: |
86 | make docker-deploy
87 |
```
--------------------------------------------------------------------------------
/libraries/python/skills/skill-library/skill_library/skills/common/routines/gpt_complete.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Any, cast
2 |
3 | from openai_client import (
4 | CompletionError,
5 | create_system_message,
6 | extra_data,
7 | make_completion_args_serializable,
8 | message_content_from_completion,
9 | validate_completion,
10 | )
11 | from skill_library import AskUserFn, EmitFn, RunContext, RunRoutineFn
12 | from skill_library.logging import logger
13 | from skill_library.skills.common import CommonSkill
14 |
15 |
16 | async def main(
17 | context: RunContext,
18 | routine_state: dict[str, Any],
19 | emit: EmitFn,
20 | run: RunRoutineFn,
21 | ask_user: AskUserFn,
22 | prompt: str,
23 | ) -> str:
24 | """Use the vast knowledge of GPT-4 completion using any prompt you provide. All information needed for the prompt should be in the prompt. No other context or content is available from anywhere other than this prompt. Don't refer to content outside the prompt. The prompt can be big. Returns the completion."""
25 |
26 | common_skill = cast(CommonSkill, context.skills["common"])
27 | language_model = common_skill.config.language_model
28 |
29 | completion_args = {
30 | "model": "gpt-4o",
31 | "messages": [
32 | create_system_message(
33 | prompt,
34 | ),
35 | ],
36 | }
37 |
38 | metadata = {}
39 | logger.debug("Completion call.", extra=extra_data(make_completion_args_serializable(completion_args)))
40 | metadata["completion_args"] = make_completion_args_serializable(completion_args)
41 | try:
42 | completion = await language_model.beta.chat.completions.parse(
43 | **completion_args,
44 | )
45 | validate_completion(completion)
46 | logger.debug("Completion response.", extra=extra_data({"completion": completion.model_dump()}))
47 | metadata["completion"] = completion.model_dump()
48 | except Exception as e:
49 | completion_error = CompletionError(e)
50 | metadata["completion_error"] = completion_error.message
51 | logger.error(
52 | completion_error.message,
53 | extra=extra_data({"completion_error": completion_error.body, "metadata": metadata}),
54 | )
55 | raise completion_error from e
56 | else:
57 | context.log("gpt_complete", metadata=metadata)
58 | return message_content_from_completion(completion)
59 |
```
--------------------------------------------------------------------------------
/assistants/codespace-assistant/assistant/response/utils/message_utils.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | from textwrap import dedent
3 |
4 | from semantic_workbench_api_model.workbench_model import (
5 | ConversationParticipant,
6 | )
7 | from semantic_workbench_assistant.assistant_app import ConversationContext
8 |
9 | from ...config import PromptsConfigModel
10 |
11 | logger = logging.getLogger(__name__)
12 |
13 |
14 | def build_system_message_content(
15 | prompts_config: PromptsConfigModel,
16 | context: ConversationContext,
17 | participants: list[ConversationParticipant],
18 | silence_token: str,
19 | additional_content: list[tuple[str, str]] | None = None,
20 | ) -> str:
21 | """
22 | Construct the system message content with tool descriptions and instructions.
23 | """
24 |
25 | system_message_content = f'{prompts_config.instruction_prompt}\n\nYour name is "{context.assistant.name}".'
26 |
27 | if len(participants) > 2:
28 | participant_names = ", ".join([
29 | f'"{participant.name}"' for participant in participants if participant.id != context.assistant.id
30 | ])
31 | system_message_content += dedent(f"""
32 | \n\n
33 | There are {len(participants)} participants in the conversation,
34 | including you as the assistant and the following users: {participant_names}.
35 | \n\n
36 | You do not need to respond to every message. Do not respond if the last thing said was a closing
37 | statement such as "bye" or "goodbye", or just a general acknowledgement like "ok" or "thanks". Do not
38 | respond as another user in the conversation, only as "{context.assistant.name}".
39 | Sometimes the other users need to talk amongst themselves and that is okay. If the conversation seems to
40 | be directed at you or the general audience, go ahead and respond.
41 | \n\n
42 | Say "{silence_token}" to skip your turn.
43 | """).strip()
44 |
45 | system_message_content += f"\n\n# Workflow Guidance:\n{prompts_config.guidance_prompt}"
46 | system_message_content += f"\n\n# Safety Guardrails:\n{prompts_config.guardrails_prompt}"
47 |
48 | if additional_content:
49 | for section in additional_content:
50 | system_message_content += f"\n\n# {section[0]}:\n{section[1]}"
51 |
52 | return system_message_content
53 |
```
--------------------------------------------------------------------------------
/libraries/python/assistant-extensions/assistant_extensions/artifacts/_inspector.py:
--------------------------------------------------------------------------------
```python
1 | #
2 | # region Inspector
3 | #
4 |
5 | from typing import TYPE_CHECKING, Awaitable, Callable
6 |
7 | from semantic_workbench_assistant.assistant_app import (
8 | AssistantContext,
9 | AssistantConversationInspectorStateDataModel,
10 | ConversationContext,
11 | )
12 |
13 | if TYPE_CHECKING:
14 | from ._artifacts import ArtifactsExtension
15 |
16 | from ._model import ArtifactsConfigModel
17 |
18 |
19 | class ArtifactConversationInspectorStateProvider:
20 | display_name = "Artifacts"
21 | description = "Artifacts that have been co-created by the participants in the conversation. NOTE: This feature is experimental and disabled by default."
22 |
23 | def __init__(
24 | self,
25 | config_provider: Callable[[AssistantContext], Awaitable[ArtifactsConfigModel]],
26 | artifacts_extension: "ArtifactsExtension",
27 | ) -> None:
28 | self.config_provider = config_provider
29 | self.artifacts_extension = artifacts_extension
30 |
31 | async def is_enabled(self, context: ConversationContext) -> bool:
32 | """
33 | Check if the artifacts extension is enabled in the assistant configuration.
34 | """
35 | config = await self.config_provider(context.assistant)
36 | return config.enabled
37 |
38 | async def get(self, context: ConversationContext) -> AssistantConversationInspectorStateDataModel:
39 | """
40 | Get the artifacts for the conversation.
41 | """
42 |
43 | # get the configuration for the artifacts extension
44 | config = await self.config_provider(context.assistant)
45 | if not config.enabled:
46 | return AssistantConversationInspectorStateDataModel(
47 | data={"content": "Artifacts are disabled in assistant configuration."}
48 | )
49 |
50 | # get the artifacts for the conversation
51 | artifacts = self.artifacts_extension.get_all_artifacts(context)
52 |
53 | if not artifacts:
54 | return AssistantConversationInspectorStateDataModel(data={"content": "No artifacts available."})
55 |
56 | # create the data model for the artifacts
57 | data_model = AssistantConversationInspectorStateDataModel(
58 | data={"artifacts": [artifact.model_dump(mode="json") for artifact in artifacts]}
59 | )
60 |
61 | return data_model
62 |
63 |
64 | # endregion
65 |
```
--------------------------------------------------------------------------------
/assistants/prospector-assistant/assistant/agents/document/config.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Annotated
2 |
3 | from guided_conversation.utils.resources import ResourceConstraint, ResourceConstraintMode, ResourceConstraintUnit
4 | from pydantic import BaseModel, Field
5 | from semantic_workbench_assistant.config import UISchema
6 |
7 | #
8 | # region Models
9 | #
10 |
11 |
12 | class ResourceConstraintConfigModel(ResourceConstraint):
13 | mode: Annotated[
14 | ResourceConstraintMode,
15 | Field(
16 | title="Resource Mode",
17 | description=(
18 | 'If "exact", the agents will try to pace the conversation to use exactly the resource quantity. If'
19 | ' "maximum", the agents will try to pace the conversation to use at most the resource quantity.'
20 | ),
21 | ),
22 | ]
23 |
24 | unit: Annotated[
25 | ResourceConstraintUnit,
26 | Field(
27 | title="Resource Unit",
28 | description="The unit for the resource constraint.",
29 | ),
30 | ]
31 |
32 | quantity: Annotated[
33 | float,
34 | Field(
35 | title="Resource Quantity",
36 | description="The quantity for the resource constraint. If <=0, the resource constraint is disabled.",
37 | ),
38 | ]
39 |
40 |
41 | class GuidedConversationConfigModel(BaseModel):
42 | rules: Annotated[
43 | list[str],
44 | Field(title="Rules", description="Do's and don'ts that the agent should attempt to follow"),
45 | UISchema(items=UISchema(widget="textarea", rows=2)),
46 | ]
47 |
48 | conversation_flow: Annotated[
49 | str,
50 | Field(
51 | title="Conversation Flow",
52 | description="A loose natural language description of the steps of the conversation",
53 | ),
54 | UISchema(widget="textarea", schema={"ui:options": {"rows": 10}}, placeholder="[optional]"),
55 | ]
56 |
57 | context: Annotated[
58 | str,
59 | Field(
60 | title="Context",
61 | description="General background context for the conversation.",
62 | ),
63 | UISchema(widget="textarea", placeholder="[optional]"),
64 | ]
65 |
66 | resource_constraint: Annotated[
67 | ResourceConstraintConfigModel,
68 | Field(
69 | title="Resource Constraint",
70 | ),
71 | UISchema(schema={"quantity": {"ui:widget": "updown"}}),
72 | ]
73 |
74 |
75 | # endregion
76 |
```
--------------------------------------------------------------------------------
/assistants/knowledge-transfer-assistant/tests/test_inspector.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Test script to verify state inspector functionality.
3 | """
4 |
5 | import asyncio
6 | import logging
7 | from unittest.mock import AsyncMock, MagicMock
8 |
9 | from assistant.assistant import assistant
10 | from semantic_workbench_api_model.workbench_model import AssistantStateEvent
11 | from semantic_workbench_assistant.assistant_app import ConversationContext
12 |
13 | # Set up logging
14 | logging.basicConfig(level=logging.INFO)
15 | logger = logging.getLogger(__name__)
16 |
17 |
18 | async def test_inspector():
19 | """Test the state inspector provider."""
20 | # Create mock context
21 | context = AsyncMock(spec=ConversationContext)
22 | context.id = "test-conversation-id"
23 | context.assistant = MagicMock()
24 | context.assistant.id = "test-assistant-id"
25 |
26 | # Mock conversation
27 | conversation = MagicMock()
28 | conversation.metadata = {"setup_complete": True, "assistant_mode": "coordinator", "share_role": "coordinator"}
29 | context.get_conversation.return_value = conversation
30 |
31 | # Test all four tabbed inspectors
32 | inspector_ids = ["brief", "objectives", "requests", "debug"] # Note: "requests" tab now shows as "Sharing"
33 |
34 | for inspector_id in inspector_ids:
35 | logger.info(f"Testing {inspector_id} inspector...")
36 |
37 | # Create state event
38 | state_event = AssistantStateEvent(state_id=inspector_id, event="focus", state=None)
39 |
40 | # Send event
41 | logger.info("Sending state event...")
42 | await context.send_conversation_state_event(state_event)
43 |
44 | # Get inspector provider
45 | inspector_provider = assistant.inspector_state_providers.get(inspector_id)
46 | if not inspector_provider:
47 | logger.error(f"No {inspector_id} inspector provider found!")
48 | continue
49 |
50 | logger.info(f"Inspector provider found: {inspector_provider.display_name}")
51 |
52 | # Get state data
53 | try:
54 | state_data = await inspector_provider.get(context)
55 | logger.info(f"State data: {state_data}")
56 | except Exception as e:
57 | logger.error(f"Error getting state data: {e}")
58 |
59 | logger.info(f"--- {inspector_id} inspector test completed ---")
60 |
61 |
62 | # Run the test
63 | if __name__ == "__main__":
64 | asyncio.run(test_inspector())
65 |
```
--------------------------------------------------------------------------------
/assistants/prospector-assistant/assistant/form_fill_extension/inspector.py:
--------------------------------------------------------------------------------
```python
1 | import contextlib
2 | import json
3 | from hashlib import md5
4 | from pathlib import Path
5 | from typing import Callable
6 |
7 | import yaml
8 | from semantic_workbench_assistant.assistant_app.context import ConversationContext
9 | from semantic_workbench_assistant.assistant_app.protocol import (
10 | AssistantConversationInspectorStateDataModel,
11 | ReadOnlyAssistantConversationInspectorStateProvider,
12 | )
13 |
14 |
15 | def project_to_yaml(state: dict) -> str:
16 | """
17 | Project the state to a yaml code block.
18 | """
19 | state_as_yaml = yaml.dump(state, sort_keys=False)
20 | return f"```yaml\n{state_as_yaml}\n```"
21 |
22 |
23 | class FileStateInspector(ReadOnlyAssistantConversationInspectorStateProvider):
24 | """
25 | A conversation inspector state provider that reads the state from a file and displays it as a yaml code block.
26 | """
27 |
28 | def __init__(
29 | self,
30 | display_name: str,
31 | file_path_source: Callable[[ConversationContext], Path],
32 | description: str = "",
33 | projector: Callable[[dict], str | dict] = project_to_yaml,
34 | ) -> None:
35 | self._state_id = md5(
36 | (type(self).__name__ + "_" + display_name).encode("utf-8"), usedforsecurity=False
37 | ).hexdigest()
38 | self._display_name = display_name
39 | self._file_path_source = file_path_source
40 | self._description = description
41 | self._projector = projector
42 |
43 | @property
44 | def state_id(self) -> str:
45 | return self._state_id
46 |
47 | @property
48 | def display_name(self) -> str:
49 | return self._display_name
50 |
51 | @property
52 | def description(self) -> str:
53 | return self._description
54 |
55 | async def is_enabled(self, context: ConversationContext) -> bool:
56 | return True
57 |
58 | async def get(self, context: ConversationContext) -> AssistantConversationInspectorStateDataModel:
59 | def read_state(path: Path) -> dict:
60 | with contextlib.suppress(FileNotFoundError):
61 | return json.loads(path.read_text(encoding="utf-8"))
62 | return {}
63 |
64 | state = read_state(self._file_path_source(context))
65 |
66 | projected = self._projector(state)
67 |
68 | return AssistantConversationInspectorStateDataModel(data={"content": projected})
69 |
```
--------------------------------------------------------------------------------
/workbench-service/semantic_workbench_service/files.py:
--------------------------------------------------------------------------------
```python
1 | import hashlib
2 | import logging
3 | import pathlib
4 | from contextlib import contextmanager
5 | from typing import BinaryIO, Iterator
6 |
7 | from pydantic_settings import BaseSettings
8 |
9 | logger = logging.getLogger(__name__)
10 |
11 |
12 | class StorageSettings(BaseSettings):
13 | root: str = ".data/files"
14 |
15 |
16 | class Storage:
17 | def __init__(self, settings: StorageSettings):
18 | self.root = pathlib.Path(settings.root)
19 | self._initialized = False
20 |
21 | def _ensure_initialized(self):
22 | if self._initialized:
23 | return
24 | self.root.mkdir(parents=True, exist_ok=True)
25 | self._initialized = True
26 | logger.info("initialized file storage; root: %s", self.root.absolute())
27 |
28 | def _file_path(self, namespace: str, filename: str, mkdir=False) -> pathlib.Path:
29 | self._ensure_initialized()
30 | namespace_path = self.root / namespace
31 | if mkdir:
32 | namespace_path.mkdir(exist_ok=True)
33 | filename_hash = hashlib.sha256(filename.encode("utf-8")).hexdigest()
34 | return namespace_path / filename_hash
35 |
36 | def path_for(self, namespace: str, filename: str) -> pathlib.Path:
37 | namespace_path = self.root / namespace
38 | if not filename:
39 | return namespace_path
40 |
41 | filename_hash = hashlib.sha256(filename.encode("utf-8")).hexdigest()
42 | return namespace_path / filename_hash
43 |
44 | def file_exists(self, namespace: str, filename: str) -> bool:
45 | file_path = self._file_path(namespace, filename)
46 | return file_path.exists()
47 |
48 | def write_file(self, namespace: str, filename: str, content: BinaryIO) -> None:
49 | file_path = self._file_path(namespace, filename, mkdir=True)
50 | with open(file_path, "wb") as f:
51 | for chunk in iter(lambda: content.read(100 * 1_024), b""):
52 | f.write(chunk)
53 |
54 | def delete_file(self, namespace: str, filename: str) -> None:
55 | file_path = self._file_path(namespace, filename)
56 | file_path.unlink(missing_ok=True)
57 |
58 | @contextmanager
59 | def read_file(self, namespace: str, filename: str) -> Iterator[BinaryIO]:
60 | file_path = self._file_path(namespace, filename)
61 | with open(file_path, "rb") as f:
62 | yield f
63 |
```