code-puppy-core-plugins 0.0.52__tar.gz → 0.0.54__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/PKG-INFO +1 -1
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/background_agents/register_callbacks.py +29 -0
- code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/README.md +32 -0
- code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +1 -0
- code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +58 -0
- code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +223 -0
- code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +48 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugins_menu.py +6 -16
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +1 -14
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/README.md +7 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +50 -22
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/state.py +61 -3
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/pyproject.toml +2 -1
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/background_agents/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/yolo_cli/register_callbacks.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: code-puppy-core-plugins
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.54
|
|
4
4
|
Summary: Official plugin bundle for Code Puppy
|
|
5
5
|
Project-URL: Repository, https://github.com/mpfaffenberger/code_puppy_core_plugins
|
|
6
6
|
Project-URL: Homepage, https://github.com/mpfaffenberger/code_puppy_core_plugins
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import inspect
|
|
5
5
|
import json
|
|
6
|
+
import time
|
|
6
7
|
from uuid import uuid4
|
|
7
8
|
|
|
8
9
|
from pydantic_ai import RunContext
|
|
@@ -13,6 +14,26 @@ _tasks: dict[str, asyncio.Task] = {}
|
|
|
13
14
|
_sessions: set[str] = set()
|
|
14
15
|
|
|
15
16
|
|
|
17
|
+
async def _publish_boundary(agent_name, prompt, result, started_at):
|
|
18
|
+
"""Publish the tool-equivalent completion signal for a detached run.
|
|
19
|
+
|
|
20
|
+
``_invoke_agent_impl`` is called directly here (not via pydantic-ai's tool
|
|
21
|
+
wrapper), so nobody fires ``post_tool_call`` for the sub-agent itself.
|
|
22
|
+
The subagent_panel relies on that event to retire the live row at the
|
|
23
|
+
run's own boundary -- without it a background row would sit on its last
|
|
24
|
+
streamed status forever (it now outlives the main turn). Mirrors /fork.
|
|
25
|
+
"""
|
|
26
|
+
from code_puppy.callbacks import on_post_tool_call
|
|
27
|
+
|
|
28
|
+
await on_post_tool_call(
|
|
29
|
+
"invoke_agent",
|
|
30
|
+
{"agent_name": agent_name, "prompt": prompt},
|
|
31
|
+
result,
|
|
32
|
+
(time.monotonic() - started_at) * 1000,
|
|
33
|
+
{"detached": True},
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
16
37
|
async def _run(task_id, owner, context, agent_name, prompt, session_id):
|
|
17
38
|
from code_puppy.agent_completion_inbox import deliver_completion
|
|
18
39
|
from code_puppy.tools.subagent_invocation import _invoke_agent_impl
|
|
@@ -24,6 +45,8 @@ async def _run(task_id, owner, context, agent_name, prompt, session_id):
|
|
|
24
45
|
if "background" in inspect.signature(_invoke_agent_impl).parameters:
|
|
25
46
|
extra["background"] = True
|
|
26
47
|
|
|
48
|
+
started_at = time.monotonic()
|
|
49
|
+
result = None
|
|
27
50
|
try:
|
|
28
51
|
result = await _invoke_agent_impl(
|
|
29
52
|
context=context,
|
|
@@ -41,6 +64,12 @@ async def _run(task_id, owner, context, agent_name, prompt, session_id):
|
|
|
41
64
|
finally:
|
|
42
65
|
_tasks.pop(task_id, None)
|
|
43
66
|
|
|
67
|
+
if result is not None:
|
|
68
|
+
try:
|
|
69
|
+
await _publish_boundary(agent_name, prompt, result, started_at)
|
|
70
|
+
except Exception:
|
|
71
|
+
pass # a panel hiccup must never eat the completion report
|
|
72
|
+
|
|
44
73
|
# A fixed prefix keeps output out of the REPL's command routing. JSON
|
|
45
74
|
# separates provenance from untrusted child output; no attachment expansion.
|
|
46
75
|
deliver_completion(
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# mcp_binding_prompt
|
|
2
|
+
|
|
3
|
+
Three MCP-install affordances layered over core at `startup`, no core edits:
|
|
4
|
+
|
|
5
|
+
1. **Synchronous post-install binding prompt.** Core's installers call
|
|
6
|
+
`mcp_binding_menu.prompt_bind_after_install_sync(server_name)` inside a
|
|
7
|
+
`try/except ImportError` -- without this plugin the call silently no-ops.
|
|
8
|
+
`register_callbacks.py` provides that function: it runs the existing
|
|
9
|
+
`build_post_install_menu` inline in the installer's foreground (inside
|
|
10
|
+
`menu_session()`, with `set_awaiting_user_input` toggled) instead of
|
|
11
|
+
scheduling a competing UI task.
|
|
12
|
+
2. **`/mcp install` is custom-JSON only** (`custom_install.py`). The bundled
|
|
13
|
+
marketplace is gone: `InstallCommand.execute` opens the custom server form
|
|
14
|
+
directly, `SearchCommand.execute` explains the removal, `HelpCommand.execute`
|
|
15
|
+
prints the trimmed help, and `MCPCompleter` stops advertising `search`.
|
|
16
|
+
3. **HTTP form fields** (`http_form.py`). When the custom form's type is
|
|
17
|
+
`http`, `run_form_flow`'s `menu_factory` is swapped for `HTTPMenu`, which
|
|
18
|
+
exposes URL / auth (none, OAuth, headers) / headers as proper fields on
|
|
19
|
+
top of the raw JSON blob. Saving validates the URL (scheme, host, no
|
|
20
|
+
embedded credentials or whitespace), the headers (string keys/values, no
|
|
21
|
+
CRLF), and runs the config through core's `http_auth` transport policy.
|
|
22
|
+
Malformed advanced JSON falls back to the core menu so it stays editable.
|
|
23
|
+
Switching type to `http` with an untouched example seeds a minimal config.
|
|
24
|
+
|
|
25
|
+
All strings go through `code_puppy.i18n` (`mcp.custom_install.*`,
|
|
26
|
+
`mcp.http_form.*`); the keys live in core's `en-US` catalog.
|
|
27
|
+
|
|
28
|
+
## Notes
|
|
29
|
+
|
|
30
|
+
- Every patch is idempotent (`_custom_json_install` / `_http_fields` markers).
|
|
31
|
+
- `HelpCommand.execute` is fully replaced, so new core `/mcp` subcommands must
|
|
32
|
+
also be added to the `mcp.custom_install.help` catalog string.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Restore the synchronous post-install MCP binding prompt."""
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Custom JSON replaces the bundled MCP marketplace at the command boundary."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from functools import wraps
|
|
5
|
+
|
|
6
|
+
from code_puppy.i18n import t
|
|
7
|
+
from code_puppy.messaging import emit_error, emit_info
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def install_custom(command, args, group_id=None):
|
|
13
|
+
"""Keep the existing form's save, cancel, and binding semantics."""
|
|
14
|
+
from code_puppy.command_line.mcp.custom_server_form import run_custom_server_form
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
run_custom_server_form(command.manager)
|
|
18
|
+
except (KeyboardInterrupt, EOFError):
|
|
19
|
+
return
|
|
20
|
+
except Exception as exc:
|
|
21
|
+
logger.exception("Custom MCP installation failed")
|
|
22
|
+
emit_error(
|
|
23
|
+
t("mcp.custom_install.failed", error=str(exc)), message_group=group_id
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def marketplace_removed(command, args, group_id=None):
|
|
28
|
+
emit_info(t("mcp.custom_install.no_marketplace"), message_group=group_id)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def custom_help(command, args, group_id=None):
|
|
32
|
+
emit_info(t("mcp.custom_install.help"), message_group=group_id)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def install_routes():
|
|
36
|
+
# Known slash commands do not reach custom_command. Install the override
|
|
37
|
+
# at startup, leaving core command_line files and existing instances intact.
|
|
38
|
+
from code_puppy.command_line.mcp.install_command import InstallCommand
|
|
39
|
+
from code_puppy.command_line.mcp.search_command import SearchCommand
|
|
40
|
+
from code_puppy.command_line.mcp.help_command import HelpCommand
|
|
41
|
+
from code_puppy.command_line.mcp_completion import MCPCompleter
|
|
42
|
+
|
|
43
|
+
original = MCPCompleter.__init__
|
|
44
|
+
if getattr(original, "_custom_json_install", False):
|
|
45
|
+
return # already routed -- never double-wrap the completer
|
|
46
|
+
InstallCommand.execute = install_custom
|
|
47
|
+
SearchCommand.execute = marketplace_removed
|
|
48
|
+
HelpCommand.execute = custom_help
|
|
49
|
+
|
|
50
|
+
@wraps(original)
|
|
51
|
+
def initialize(completer, *args, **kwargs):
|
|
52
|
+
original(completer, *args, **kwargs)
|
|
53
|
+
for commands in (completer.general_subcommands, completer.all_subcommands):
|
|
54
|
+
commands.pop("search", None)
|
|
55
|
+
commands["install"] = t("mcp.custom_install.description")
|
|
56
|
+
|
|
57
|
+
initialize._custom_json_install = True
|
|
58
|
+
MCPCompleter.__init__ = initialize
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""HTTP fields layered over the existing custom form and persistence loop."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from urllib.parse import urlsplit
|
|
5
|
+
|
|
6
|
+
from code_puppy.i18n import t
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def read_config(form):
|
|
10
|
+
config = json.loads(form.json_config)
|
|
11
|
+
if not isinstance(config, dict):
|
|
12
|
+
raise ValueError(t("mcp.http_form.object_required"))
|
|
13
|
+
return config
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def validate_headers(headers):
|
|
17
|
+
"""Non-empty string keys, string values, no CRLF (header injection)."""
|
|
18
|
+
if not isinstance(headers, dict) or any(
|
|
19
|
+
not isinstance(key, str)
|
|
20
|
+
or not isinstance(value, str)
|
|
21
|
+
or not key
|
|
22
|
+
or any(char in key + value for char in "\r\n")
|
|
23
|
+
for key, value in headers.items()
|
|
24
|
+
):
|
|
25
|
+
raise ValueError(t("mcp.http_form.invalid_headers"))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def validate_config(config):
|
|
29
|
+
url = config.get("url", "")
|
|
30
|
+
if not isinstance(url, str):
|
|
31
|
+
raise ValueError(t("mcp.http_form.invalid_url"))
|
|
32
|
+
parsed = urlsplit(url)
|
|
33
|
+
if (
|
|
34
|
+
parsed.scheme not in ("https", "http")
|
|
35
|
+
or not parsed.hostname
|
|
36
|
+
or parsed.username is not None
|
|
37
|
+
or parsed.password is not None
|
|
38
|
+
or any(char.isspace() for char in url)
|
|
39
|
+
):
|
|
40
|
+
raise ValueError(t("mcp.http_form.invalid_url"))
|
|
41
|
+
headers = config.get("headers", {})
|
|
42
|
+
validate_headers(headers)
|
|
43
|
+
from code_puppy.mcp_.http_auth import http_auth
|
|
44
|
+
|
|
45
|
+
# Reuse transport security policy; constructing OAuth does not start login.
|
|
46
|
+
http_auth(config, url, headers)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def save_config(form, config):
|
|
50
|
+
form.json_config = json.dumps(config, indent=2)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def input_text(title, initial):
|
|
54
|
+
from termflow.tui import TextInputBuilder
|
|
55
|
+
from code_puppy.command_line.tui_style import menu_style
|
|
56
|
+
|
|
57
|
+
builder = TextInputBuilder(title).initial(initial).alt_screen(False)
|
|
58
|
+
style = menu_style()
|
|
59
|
+
if style is not None:
|
|
60
|
+
builder.style(style)
|
|
61
|
+
result = builder.build().run()
|
|
62
|
+
return None if result.cancelled else result.value
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def choose_auth(config):
|
|
66
|
+
from termflow.tui import MenuBuilder, MenuItem
|
|
67
|
+
from code_puppy.command_line.tui_style import themed
|
|
68
|
+
|
|
69
|
+
result = (
|
|
70
|
+
themed(
|
|
71
|
+
MenuBuilder(t("mcp.http_form.auth"))
|
|
72
|
+
.items(
|
|
73
|
+
[
|
|
74
|
+
MenuItem(t("mcp.http_form.none"), value="none"),
|
|
75
|
+
MenuItem(t("mcp.http_form.oauth"), value="oauth"),
|
|
76
|
+
MenuItem(t("mcp.http_form.headers_auth"), value="headers"),
|
|
77
|
+
]
|
|
78
|
+
)
|
|
79
|
+
.alt_screen(False)
|
|
80
|
+
)
|
|
81
|
+
.build()
|
|
82
|
+
.run()
|
|
83
|
+
)
|
|
84
|
+
if result.cancelled or result.item is None:
|
|
85
|
+
return False
|
|
86
|
+
if result.item.value == "oauth":
|
|
87
|
+
config["auth"] = "oauth"
|
|
88
|
+
# New OAuth selections need time for a human to finish browser login.
|
|
89
|
+
if config.get("timeout", 30) == 30:
|
|
90
|
+
config["timeout"] = 330
|
|
91
|
+
else:
|
|
92
|
+
config.pop("auth", None)
|
|
93
|
+
if result.item.value == "none":
|
|
94
|
+
headers = config.get("headers", {})
|
|
95
|
+
config["headers"] = {
|
|
96
|
+
key: val for key, val in headers.items() if key.lower() != "authorization"
|
|
97
|
+
}
|
|
98
|
+
if result.item.value == "headers":
|
|
99
|
+
return edit_headers(config)
|
|
100
|
+
return True
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def edit_headers(config):
|
|
104
|
+
value = input_text(
|
|
105
|
+
t("mcp.http_form.headers_prompt"), json.dumps(config.get("headers", {}))
|
|
106
|
+
)
|
|
107
|
+
if value is None:
|
|
108
|
+
return False
|
|
109
|
+
try:
|
|
110
|
+
headers = json.loads(value or "{}")
|
|
111
|
+
except ValueError:
|
|
112
|
+
# A JSONDecodeError message is noise in the footer; say what we mean.
|
|
113
|
+
raise ValueError(t("mcp.http_form.invalid_headers")) from None
|
|
114
|
+
validate_headers(headers)
|
|
115
|
+
if headers:
|
|
116
|
+
config["headers"] = headers
|
|
117
|
+
else:
|
|
118
|
+
config.pop("headers", None)
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class HTTPMenu:
|
|
123
|
+
def __init__(self, form, original, overrides):
|
|
124
|
+
self.form = form
|
|
125
|
+
self.original = original
|
|
126
|
+
self.overrides = overrides
|
|
127
|
+
|
|
128
|
+
def run(self):
|
|
129
|
+
from termflow.tui import MenuBuilder, MenuItem
|
|
130
|
+
from code_puppy.command_line.tui_style import themed
|
|
131
|
+
|
|
132
|
+
form = self.form
|
|
133
|
+
while True:
|
|
134
|
+
try:
|
|
135
|
+
config = read_config(form)
|
|
136
|
+
except (ValueError, TypeError):
|
|
137
|
+
# Advanced malformed JSON remains editable, never discarded.
|
|
138
|
+
return self.original(form, **self.overrides).run()
|
|
139
|
+
auth = (
|
|
140
|
+
"oauth"
|
|
141
|
+
if config.get("auth") == "oauth"
|
|
142
|
+
else (
|
|
143
|
+
"headers_auth"
|
|
144
|
+
if any(
|
|
145
|
+
key.lower() == "authorization"
|
|
146
|
+
for key in config.get("headers", {})
|
|
147
|
+
)
|
|
148
|
+
else "none"
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
items = [
|
|
152
|
+
MenuItem(t("mcp.http_form.name", name=form.server_name), value="name"),
|
|
153
|
+
MenuItem(t("mcp.http_form.type"), value="type"),
|
|
154
|
+
MenuItem(t("mcp.http_form.url"), value="http_url"),
|
|
155
|
+
MenuItem(
|
|
156
|
+
t("mcp.http_form.auth_value", auth=t("mcp.http_form." + auth)),
|
|
157
|
+
value="http_auth",
|
|
158
|
+
),
|
|
159
|
+
MenuItem(t("mcp.http_form.headers"), value="http_headers"),
|
|
160
|
+
MenuItem(t("mcp.http_form.advanced"), value="json"),
|
|
161
|
+
MenuItem(t("mcp.http_form.save"), value="save"),
|
|
162
|
+
MenuItem(t("mcp.http_form.cancel"), value="cancel"),
|
|
163
|
+
]
|
|
164
|
+
# Do not echo credentials, header values, or URL query secrets.
|
|
165
|
+
builder = themed(
|
|
166
|
+
MenuBuilder(t("mcp.http_form.title")).items(items).alt_screen(False)
|
|
167
|
+
)
|
|
168
|
+
if form.validation_error:
|
|
169
|
+
builder.footer_hint(form.validation_error)
|
|
170
|
+
result = builder.build().run()
|
|
171
|
+
if result.cancelled or result.item is None:
|
|
172
|
+
return result
|
|
173
|
+
field = result.item.value
|
|
174
|
+
try:
|
|
175
|
+
if field == "http_url":
|
|
176
|
+
value = input_text(t("mcp.http_form.url"), config.get("url", ""))
|
|
177
|
+
if value is not None:
|
|
178
|
+
config["url"] = value.strip()
|
|
179
|
+
save_config(form, config)
|
|
180
|
+
elif field == "http_auth":
|
|
181
|
+
if choose_auth(config):
|
|
182
|
+
save_config(form, config)
|
|
183
|
+
elif field == "http_headers":
|
|
184
|
+
if edit_headers(config):
|
|
185
|
+
save_config(form, config)
|
|
186
|
+
elif field == "save":
|
|
187
|
+
validate_config(config)
|
|
188
|
+
return result
|
|
189
|
+
else:
|
|
190
|
+
return result
|
|
191
|
+
form.validation_error = None
|
|
192
|
+
except (ValueError, TypeError) as exc:
|
|
193
|
+
form.validation_error = str(exc)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def install_http_form():
|
|
197
|
+
from code_puppy.command_line.mcp import custom_server_form as core
|
|
198
|
+
|
|
199
|
+
original = core.run_form_flow
|
|
200
|
+
if getattr(original, "_http_fields", False):
|
|
201
|
+
return
|
|
202
|
+
|
|
203
|
+
def menu(form, **overrides):
|
|
204
|
+
if form._get_current_type() == "http":
|
|
205
|
+
return HTTPMenu(form, core.build_form_menu, overrides)
|
|
206
|
+
return core.build_form_menu(form, **overrides)
|
|
207
|
+
|
|
208
|
+
def type_menu(form):
|
|
209
|
+
old_type = form._get_current_type()
|
|
210
|
+
untouched = (
|
|
211
|
+
form.json_config.strip() == core.CUSTOM_SERVER_EXAMPLES[old_type].strip()
|
|
212
|
+
)
|
|
213
|
+
core.run_type_menu(form)
|
|
214
|
+
if old_type != "http" and form._get_current_type() == "http" and untouched:
|
|
215
|
+
save_config(form, {"type": "http", "url": "", "timeout": 30})
|
|
216
|
+
|
|
217
|
+
def run(form, **kwargs):
|
|
218
|
+
kwargs.setdefault("menu_factory", menu)
|
|
219
|
+
kwargs.setdefault("type_menu", type_menu)
|
|
220
|
+
return original(form, **kwargs)
|
|
221
|
+
|
|
222
|
+
run._http_fields = True
|
|
223
|
+
core.run_form_flow = run
|
code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Bridge synchronous installers to the existing binding menu via startup."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from code_puppy.callbacks import register_callback
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def prompt_bind_after_install_sync(server_name: str) -> None:
|
|
11
|
+
"""Run in the installer's foreground, never schedule a competing UI task."""
|
|
12
|
+
from code_puppy.agents import get_available_agents
|
|
13
|
+
from code_puppy.command_line.mcp_binding_menu import (
|
|
14
|
+
build_post_install_menu,
|
|
15
|
+
menu_session,
|
|
16
|
+
set_awaiting_user_input,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
agents = sorted(get_available_agents(), key=str.lower)
|
|
20
|
+
if not agents:
|
|
21
|
+
return
|
|
22
|
+
set_awaiting_user_input(True)
|
|
23
|
+
try:
|
|
24
|
+
with menu_session():
|
|
25
|
+
build_post_install_menu(server_name, agents, alt_screen=False).run()
|
|
26
|
+
finally:
|
|
27
|
+
set_awaiting_user_input(False)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _install() -> None:
|
|
31
|
+
try:
|
|
32
|
+
from code_puppy.command_line import mcp_binding_menu
|
|
33
|
+
|
|
34
|
+
if not hasattr(mcp_binding_menu, "prompt_bind_after_install_sync"):
|
|
35
|
+
mcp_binding_menu.prompt_bind_after_install_sync = (
|
|
36
|
+
prompt_bind_after_install_sync
|
|
37
|
+
)
|
|
38
|
+
from .custom_install import install_routes
|
|
39
|
+
|
|
40
|
+
install_routes()
|
|
41
|
+
from .http_form import install_http_form
|
|
42
|
+
|
|
43
|
+
install_http_form()
|
|
44
|
+
except Exception:
|
|
45
|
+
logger.exception("Could not install MCP binding prompt compatibility bridge")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
register_callback("startup", _install)
|
|
@@ -82,8 +82,6 @@ class PluginsMenu:
|
|
|
82
82
|
self.plugins: List[_PluginEntry] = []
|
|
83
83
|
self.disabled: set[str] = set()
|
|
84
84
|
self.project_dir: Optional[str] = None
|
|
85
|
-
self.lock_builtin: bool = False
|
|
86
|
-
self.hidden_builtin_count: int = 0
|
|
87
85
|
|
|
88
86
|
# The trust modal disables list bindings while open, keeping accept-word
|
|
89
87
|
# typing from triggering shortcuts; focus remains on its input.
|
|
@@ -131,27 +129,19 @@ class PluginsMenu:
|
|
|
131
129
|
get_project_plugins_directory,
|
|
132
130
|
)
|
|
133
131
|
from code_puppy.plugins.config import get_disabled_plugins
|
|
134
|
-
from code_puppy.plugins.config import (
|
|
135
|
-
get_lock_builtin_plugins,
|
|
136
|
-
)
|
|
137
132
|
|
|
138
133
|
loaded = get_loaded_plugins()
|
|
139
134
|
self.disabled = get_disabled_plugins()
|
|
140
|
-
self.lock_builtin = get_lock_builtin_plugins()
|
|
141
135
|
|
|
142
136
|
project_dir = get_project_plugins_directory()
|
|
143
137
|
self.project_dir = project_dir.as_posix() if project_dir else None
|
|
144
138
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
for
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if self.lock_builtin and tier == "builtin":
|
|
152
|
-
self.hidden_builtin_count += 1
|
|
153
|
-
continue
|
|
154
|
-
entries.append(_PluginEntry(name, tier))
|
|
139
|
+
# Every tier is listed and toggleable -- builtins included.
|
|
140
|
+
entries: List[_PluginEntry] = [
|
|
141
|
+
_PluginEntry(name, tier)
|
|
142
|
+
for tier in ("builtin", "user", "project")
|
|
143
|
+
for name in sorted(loaded.get(tier, []))
|
|
144
|
+
]
|
|
155
145
|
|
|
156
146
|
# Project plugins held back by the trust gate — shown so Enter can
|
|
157
147
|
# open the ceremony popup on them.
|
|
@@ -72,21 +72,8 @@ def render_list(menu: "PluginsMenu") -> Fragments:
|
|
|
72
72
|
lines.append(("bold", " Plugins"))
|
|
73
73
|
lines.append(("", "\n\n"))
|
|
74
74
|
|
|
75
|
-
if menu.lock_builtin and menu.hidden_builtin_count:
|
|
76
|
-
lines.append(
|
|
77
|
-
(
|
|
78
|
-
"class:tui.muted",
|
|
79
|
-
f" {menu.hidden_builtin_count} builtin plugins are "
|
|
80
|
-
f"managed and hidden.",
|
|
81
|
-
)
|
|
82
|
-
)
|
|
83
|
-
lines.append(("", "\n\n"))
|
|
84
|
-
|
|
85
75
|
if not menu.plugins:
|
|
86
|
-
|
|
87
|
-
lines.append(("class:tui.warning", " No user or project plugins loaded."))
|
|
88
|
-
else:
|
|
89
|
-
lines.append(("class:tui.warning", " No plugins loaded."))
|
|
76
|
+
lines.append(("class:tui.warning", " No plugins loaded."))
|
|
90
77
|
lines.append(("", "\n"))
|
|
91
78
|
_render_hints(lines)
|
|
92
79
|
return lines
|
|
@@ -56,6 +56,13 @@ Milo is thinking... ( o )
|
|
|
56
56
|
(The redundant core "<check> <name> completed successfully" line is suppressed.)
|
|
57
57
|
Nested agents get a compact one-liner frozen record instead of the full block:
|
|
58
58
|
`<elbow> name (check) mm:ss completed model`.
|
|
59
|
+
- **Detached rows outlive the turn.** `FORK` and `BACKGROUND` runs are their own
|
|
60
|
+
asyncio tasks, so when the main agent's turn ends only the *foreground* swarm
|
|
61
|
+
is retired from the panel -- a still-running fork/background row keeps
|
|
62
|
+
ticking at the idle prompt until it finishes at its own boundary (the
|
|
63
|
+
launcher publishes a `post_tool_call` with `{"detached": True}`; `/fork`'s
|
|
64
|
+
older `{"detached_fork": True}` spelling is honoured too). Ctrl+C still
|
|
65
|
+
clears everything, because the cancel sweep takes detached runs down as well.
|
|
59
66
|
|
|
60
67
|
## How it works (3 monkeypatches, 1 callback -- no core edits)
|
|
61
68
|
|
|
@@ -21,6 +21,9 @@ Install strategy (startup monkeypatches of seams with no hook + callbacks):
|
|
|
21
21
|
but KEPT in the live tree (shown 'completed') so it never vanishes
|
|
22
22
|
mid-run; the whole subtree flushes to the transcript parent-first only
|
|
23
23
|
when its ROOT finishes, then is removed from the live tree.
|
|
24
|
+
DETACHED trees (/fork, background=True) outlive the main turn: end-of-
|
|
25
|
+
turn cleanup only retires the foreground swarm, so a detached row keeps
|
|
26
|
+
ticking at the idle prompt until its own ``post_tool_call`` boundary.
|
|
24
27
|
4. subagent_invocation.emit_success -> suppress the redundant
|
|
25
28
|
"<check> <name> completed successfully" line (it comes from the separate
|
|
26
29
|
message_queue system, NOT the bus, so it must be dropped at its source).
|
|
@@ -225,25 +228,35 @@ def _handle_frozen(console, session_id):
|
|
|
225
228
|
|
|
226
229
|
|
|
227
230
|
def _maybe_flush_group(console):
|
|
228
|
-
"""Flush the
|
|
229
|
-
|
|
230
|
-
running, completed agents stay grouped in the live panel (shown
|
|
231
|
-
so the panel remains a single cohesive block
|
|
231
|
+
"""Flush the settled panel rows to scrollback as one group (parent-first
|
|
232
|
+
DFS) -- but ONLY when the foreground swarm is idle. While any foreground
|
|
233
|
+
agent is running, completed agents stay grouped in the live panel (shown
|
|
234
|
+
'completed'), so the panel remains a single cohesive block.
|
|
235
|
+
|
|
236
|
+
Detached trees (/fork, background) whose root is still running are NOT
|
|
237
|
+
part of the group: they keep their live rows and flush at their own
|
|
238
|
+
boundary, exactly like the rest of their lifecycle.
|
|
232
239
|
"""
|
|
233
|
-
|
|
234
|
-
if
|
|
235
|
-
return
|
|
236
|
-
if any(not e.get("done") for e in rows):
|
|
240
|
+
state.snapshot() # idle-prune before deciding
|
|
241
|
+
if state.foreground_busy():
|
|
237
242
|
return # swarm still busy -- keep the panel grouped + live
|
|
238
243
|
if console is None:
|
|
239
244
|
return
|
|
240
|
-
|
|
245
|
+
settled = state.pop_settled()
|
|
246
|
+
if not settled:
|
|
247
|
+
return
|
|
241
248
|
console.print() # breathing room between the transcript and the group
|
|
242
|
-
for line in _row_lines(
|
|
249
|
+
for line in _row_lines(_ordered_tree(settled), frame=None):
|
|
243
250
|
console.print(line)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
251
|
+
_retire_ticker_if_idle()
|
|
252
|
+
_push_panel(force=True) # collapse the flushed rows
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def _retire_ticker_if_idle() -> None:
|
|
256
|
+
"""Stop the clock only once nothing is left to clock -- a live detached
|
|
257
|
+
row still needs its mm:ss advancing after the foreground flushes."""
|
|
258
|
+
if not state.has_active():
|
|
259
|
+
_stop_ticker()
|
|
247
260
|
|
|
248
261
|
|
|
249
262
|
# Monkeypatch installers
|
|
@@ -442,11 +455,16 @@ async def _on_agent_run_end(
|
|
|
442
455
|
response_text=None,
|
|
443
456
|
metadata=None,
|
|
444
457
|
):
|
|
445
|
-
"""When the TOP-LEVEL turn ends,
|
|
458
|
+
"""When the TOP-LEVEL turn ends, retire the foreground swarm so a root that
|
|
446
459
|
errored or was cancelled (never flushed) can't leak its 'completed' children
|
|
447
|
-
into the next prompt's live block.
|
|
448
|
-
|
|
449
|
-
|
|
460
|
+
into the next prompt's live block.
|
|
461
|
+
|
|
462
|
+
Detached trees (/fork, background) that are still running SURVIVE: their
|
|
463
|
+
task outlives the turn, so their live row does too -- the panel keeps
|
|
464
|
+
ticking at the idle prompt until they finish at their own boundary.
|
|
465
|
+
|
|
466
|
+
Only fires for the main agent -- sub-agent runs go through
|
|
467
|
+
temp_agent.run(), not _runtime, and is_subagent() guards the rest.
|
|
450
468
|
"""
|
|
451
469
|
if not _runtime_enabled():
|
|
452
470
|
return
|
|
@@ -458,10 +476,10 @@ async def _on_agent_run_end(
|
|
|
458
476
|
except Exception:
|
|
459
477
|
pass
|
|
460
478
|
try:
|
|
461
|
-
state.
|
|
479
|
+
state.pop_settled() # discard foreground leftovers; detached rows stay
|
|
462
480
|
except Exception:
|
|
463
481
|
pass
|
|
464
|
-
|
|
482
|
+
_retire_ticker_if_idle() # never leave an orphan clock task
|
|
465
483
|
_push_panel(force=True)
|
|
466
484
|
|
|
467
485
|
|
|
@@ -483,6 +501,15 @@ async def _on_agent_run_cancel(group_id=None):
|
|
|
483
501
|
_push_panel(force=True)
|
|
484
502
|
|
|
485
503
|
|
|
504
|
+
def _is_detached_context(context) -> bool:
|
|
505
|
+
"""Did a detached launcher (/fork or background_agents) publish this
|
|
506
|
+
``post_tool_call``? Both keys mean the same thing; ``detached_fork`` is
|
|
507
|
+
the older spelling kept so an older /fork plugin still retires its row."""
|
|
508
|
+
if not isinstance(context, dict):
|
|
509
|
+
return False
|
|
510
|
+
return bool(context.get("detached") or context.get("detached_fork"))
|
|
511
|
+
|
|
512
|
+
|
|
486
513
|
async def _on_post_tool_call(tool_name, tool_args, result, duration_ms, context=None):
|
|
487
514
|
"""Authoritative completion **state** signal for sub-agent invocations.
|
|
488
515
|
|
|
@@ -525,9 +552,10 @@ async def _on_post_tool_call(tool_name, tool_args, result, duration_ms, context=
|
|
|
525
552
|
if not sid:
|
|
526
553
|
return
|
|
527
554
|
try:
|
|
528
|
-
# Keep ordinary calls until their foreground root flushes; detached
|
|
529
|
-
# have no root, so finish them at
|
|
530
|
-
|
|
555
|
+
# Keep ordinary calls until their foreground root flushes; detached
|
|
556
|
+
# runs (/fork, background) have no foreground root, so finish them at
|
|
557
|
+
# their own boundary. ``detached_fork`` is the legacy key /fork sends.
|
|
558
|
+
if _is_detached_context(context):
|
|
531
559
|
state.finish(sid)
|
|
532
560
|
else:
|
|
533
561
|
err = getattr(result, "error", None)
|