code-puppy-core-plugins 0.0.58__tar.gz → 0.0.60__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.58 → code_puppy_core_plugins-0.0.60}/PKG-INFO +1 -1
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/background_agents/register_callbacks.py +10 -8
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/README.md +36 -2
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/client.py +35 -4
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/register_callbacks.py +49 -1
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/reporter.py +6 -1
- code_puppy_core_plugins-0.0.60/code_puppy_core_plugins/herdr/restore.py +284 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/pyproject.toml +1 -1
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/background_agents/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/profiles/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/profiles/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/profiles/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/profiles/menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.60}/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.60
|
|
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
|
|
@@ -61,15 +61,9 @@ async def _run(task_id, owner, context, agent_name, prompt, session_id):
|
|
|
61
61
|
payload = {"agent_name": agent_name, "error": "Background sub-agent cancelled."}
|
|
62
62
|
except Exception as exc:
|
|
63
63
|
payload = {"agent_name": agent_name, "error": str(exc)}
|
|
64
|
-
finally:
|
|
65
|
-
_tasks.pop(task_id, None)
|
|
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
64
|
|
|
65
|
+
# Notify the owner before awaiting observer callbacks: a stalled or
|
|
66
|
+
# cancelled observer must not prevent the main agent from resuming.
|
|
73
67
|
# A fixed prefix keeps output out of the REPL's command routing. JSON
|
|
74
68
|
# separates provenance from untrusted child output; no attachment expansion.
|
|
75
69
|
deliver_completion(
|
|
@@ -79,6 +73,14 @@ async def _run(task_id, owner, context, agent_name, prompt, session_id):
|
|
|
79
73
|
+ json.dumps({"task_id": task_id, **payload}, ensure_ascii=False),
|
|
80
74
|
)
|
|
81
75
|
|
|
76
|
+
# Keep the task registered through observer cleanup so shutdown can cancel it.
|
|
77
|
+
# The task's done callback owns removal from both registries.
|
|
78
|
+
if result is not None:
|
|
79
|
+
try:
|
|
80
|
+
await _publish_boundary(agent_name, prompt, result, started_at)
|
|
81
|
+
except Exception:
|
|
82
|
+
pass # observer failures do not affect the already-delivered report
|
|
83
|
+
|
|
82
84
|
|
|
83
85
|
async def launch_background_agent(
|
|
84
86
|
context: RunContext,
|
|
@@ -92,8 +92,41 @@ durable autosave name and pickle path) via `pane.report_agent_session` --
|
|
|
92
92
|
not the per-run `group_id`, which changes every turn. It re-reports only
|
|
93
93
|
when the reference actually changes (after `/clear`, `/session new`,
|
|
94
94
|
`/autosave_load`, `/load_context`, a quick resume, or an agent switch).
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
|
|
96
|
+
## Auto-resume on launch
|
|
97
|
+
|
|
98
|
+
A herdr server restart kills pane processes, and herdr only *restores*
|
|
99
|
+
panes whose agent reported a native session reference through an **official**
|
|
100
|
+
herdr integration. code-puppy is not one of those today, so herdr stores
|
|
101
|
+
nothing for us -- verified against herdr 0.9.1: `pane.report_agent_session`
|
|
102
|
+
is accepted, but `pane.get` exposes no `agent_session` for the `codepuppy`
|
|
103
|
+
agent (the identical call for `codex` does).
|
|
104
|
+
|
|
105
|
+
So the plugin is self-sufficient. Whenever it reports a session reference it
|
|
106
|
+
also records a tiny **pane -> session map** (`herdr_pane_sessions.json`) under
|
|
107
|
+
`XDG_STATE_HOME` -- never inside the plugin dir, which would self-tamper the
|
|
108
|
+
trust hash. On startup inside a pane it resolves the previous session and
|
|
109
|
+
loads it into the agent, exactly like `-r`:
|
|
110
|
+
|
|
111
|
+
1. herdr's own stored reference via `pane.get` (forward-compatible: the day
|
|
112
|
+
herdr recognises codepuppy, or grows a custom-integration hook, this wins);
|
|
113
|
+
2. else the local pane map.
|
|
114
|
+
|
|
115
|
+
An explicit `-r` / `--quick-resume` always wins (the plugin captures the
|
|
116
|
+
intent from the `handle_cli_args` hook), and headless `-p` runs never
|
|
117
|
+
auto-resume. Set `HERDR_NO_AUTO_RESUME=1` for a deliberately fresh session
|
|
118
|
+
in a reused pane. Everything is fail-soft: a missing socket, a vanished
|
|
119
|
+
session file, or an unreadable map simply yields a fresh session.
|
|
120
|
+
|
|
121
|
+
Net effect: restart herdr, start code-puppy in the restored pane, and your
|
|
122
|
+
conversation is already back on screen.
|
|
123
|
+
|
|
124
|
+
> This ships in the `code-puppy-core-plugins` bundle. Most people run code-puppy
|
|
125
|
+
> through `uvx`, so nothing to install locally: the change reaches them on the
|
|
126
|
+
> next PyPI release. Because `code-puppy` depends on the bundle by range
|
|
127
|
+
> (`>=0.0.58`), a fresh resolve picks the new version up automatically -- but
|
|
128
|
+
> `uvx` reuses a warm cache, so a user may need `uvx --refresh code-puppy`
|
|
129
|
+
> (or `uvx -U code-puppy`) once.
|
|
97
130
|
|
|
98
131
|
## Conversation titles
|
|
99
132
|
|
|
@@ -199,6 +232,7 @@ state, metadata, and activity.
|
|
|
199
232
|
| `client.py` | herdr socket transport (JSON, worker thread)|
|
|
200
233
|
| `reporter.py` | event -> state machine (refcount + dedup) |
|
|
201
234
|
| `sources.py` | fail-soft adapters (tokens / title / session / msg) |
|
|
235
|
+
| `restore.py` | pane -> session map + auto-resume on startup |
|
|
202
236
|
| `register_callbacks.py` | callback wiring + env activation guard |
|
|
203
237
|
| `smoke.py` | manual live smoke test (disposable pane + tab) |
|
|
204
238
|
|
|
@@ -13,10 +13,11 @@ This module speaks herdr's newline-delimited JSON socket protocol far
|
|
|
13
13
|
enough to call ``pane.report_agent`` / ``pane.report_agent_session`` /
|
|
14
14
|
``pane.report_metadata`` / ``pane.release_agent`` -- plus ``tab.get`` /
|
|
15
15
|
``tab.rename`` for the workspace-tab label (only while the tab holds a
|
|
16
|
-
single pane)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
single pane), and ``pane.get`` to read back a stored native session
|
|
17
|
+
reference (:meth:`HerdrClient.get_agent_session`). It reads herdr's ack
|
|
18
|
+
(and retries a few times if it doesn't come) so an authoritative state
|
|
19
|
+
edge is never silently lost, but it never raises into the caller:
|
|
20
|
+
reporting agent state must never be able to disturb the agent itself.
|
|
20
21
|
|
|
21
22
|
Delivery runs on a single daemon worker thread fed by **coalescing
|
|
22
23
|
mailbox slots** rather than an unbounded queue:
|
|
@@ -78,6 +79,7 @@ _M_STATE = "pane.report_agent"
|
|
|
78
79
|
_M_SESSION = "pane.report_agent_session"
|
|
79
80
|
_M_METADATA = "pane.report_metadata"
|
|
80
81
|
_M_RELEASE = "pane.release_agent"
|
|
82
|
+
_M_PANE_GET = "pane.get"
|
|
81
83
|
_M_TAB_GET = "tab.get"
|
|
82
84
|
_M_TAB_RENAME = "tab.rename"
|
|
83
85
|
|
|
@@ -135,6 +137,10 @@ class HerdrClient:
|
|
|
135
137
|
def active(self) -> bool:
|
|
136
138
|
return self._active
|
|
137
139
|
|
|
140
|
+
@property
|
|
141
|
+
def pane_id(self) -> Optional[str]:
|
|
142
|
+
return self._pane_id
|
|
143
|
+
|
|
138
144
|
def _start_worker(self) -> None:
|
|
139
145
|
self._worker = threading.Thread(
|
|
140
146
|
target=self._run,
|
|
@@ -172,6 +178,31 @@ class HerdrClient:
|
|
|
172
178
|
params["message"] = message
|
|
173
179
|
self._put("_state" if critical else "_message", params)
|
|
174
180
|
|
|
181
|
+
def get_agent_session(self) -> Optional[Dict[str, Any]]:
|
|
182
|
+
"""Read herdr's stored native session reference for this pane.
|
|
183
|
+
|
|
184
|
+
Returns the ``agent_session`` object (``{"source", "agent", "kind",
|
|
185
|
+
"value"}``) when herdr has one stored for this pane, else ``None``.
|
|
186
|
+
|
|
187
|
+
This is the only *read* the plugin performs for restore. It is
|
|
188
|
+
bounded (one request/response on a fresh connection, 0.5s timeout)
|
|
189
|
+
and degrades to ``None`` on any failure -- a herdr version that does
|
|
190
|
+
not store a reference for us (code-puppy is not an *official* herdr
|
|
191
|
+
agent, so herdr 0.9.x stores nothing here) simply returns ``None``
|
|
192
|
+
and the caller falls back to its own store.
|
|
193
|
+
"""
|
|
194
|
+
if not self._active:
|
|
195
|
+
return None
|
|
196
|
+
reply = self._request(_M_PANE_GET, {"pane_id": self._pane_id})
|
|
197
|
+
if not isinstance(reply, dict):
|
|
198
|
+
return None
|
|
199
|
+
result = reply.get("result")
|
|
200
|
+
pane = result.get("pane") if isinstance(result, dict) else None
|
|
201
|
+
if not isinstance(pane, dict):
|
|
202
|
+
return None
|
|
203
|
+
session = pane.get("agent_session")
|
|
204
|
+
return session if isinstance(session, dict) else None
|
|
205
|
+
|
|
175
206
|
def report_session(
|
|
176
207
|
self,
|
|
177
208
|
agent_session_id: Optional[str] = None,
|
|
@@ -23,7 +23,8 @@ nothing for herdr to guess.
|
|
|
23
23
|
|
|
24
24
|
Callback -> effect:
|
|
25
25
|
|
|
26
|
-
* ``startup`` ......................................... resync (-> idle)
|
|
26
|
+
* ``startup`` ......................................... resync (-> idle) + auto-resume
|
|
27
|
+
* ``handle_cli_args`` ................................ capture -r / --quick-resume intent
|
|
27
28
|
* ``session_end`` / ``shutdown`` ..................... release pane authority
|
|
28
29
|
* ``user_prompt_submit`` ............................. refresh durable session
|
|
29
30
|
* ``agent_run_start`` / ``agent_run_end`` ............ run-depth +/- 1
|
|
@@ -62,6 +63,7 @@ import signal
|
|
|
62
63
|
|
|
63
64
|
from code_puppy.callbacks import register_callback
|
|
64
65
|
|
|
66
|
+
from . import restore
|
|
65
67
|
from .client import HerdrClient
|
|
66
68
|
from .reporter import HerdrReporter
|
|
67
69
|
|
|
@@ -82,13 +84,58 @@ _TERMINATING_SIGNALS = tuple(
|
|
|
82
84
|
_client = HerdrClient()
|
|
83
85
|
_reporter = HerdrReporter(_client)
|
|
84
86
|
|
|
87
|
+
#: Set from ``handle_cli_args`` so startup auto-resume yields to an explicit
|
|
88
|
+
#: ``-r`` / ``--quick-resume``. The plugin cannot see the parsed args from the
|
|
89
|
+
#: ``startup`` callback, and that hook fires *before* ``-r`` is applied -- so
|
|
90
|
+
#: we capture the intent here rather than re-parsing ``sys.argv`` (DRY).
|
|
91
|
+
_cli_resume_requested = False
|
|
92
|
+
_cli_headless = False
|
|
93
|
+
|
|
85
94
|
|
|
86
95
|
def _arg(args: tuple, index: int):
|
|
87
96
|
return args[index] if len(args) > index else None
|
|
88
97
|
|
|
89
98
|
|
|
99
|
+
def _on_handle_cli_args(args) -> None:
|
|
100
|
+
"""Record whether the user asked for an explicit resume / headless run.
|
|
101
|
+
|
|
102
|
+
Runs after ``parse_args()`` and before ``startup``. Never handles the args
|
|
103
|
+
itself; returning ``None`` lets normal startup proceed.
|
|
104
|
+
"""
|
|
105
|
+
global _cli_resume_requested, _cli_headless
|
|
106
|
+
try:
|
|
107
|
+
_cli_resume_requested = bool(getattr(args, "resume", None)) or (
|
|
108
|
+
getattr(args, "quick_resume", None) is not None
|
|
109
|
+
)
|
|
110
|
+
_cli_headless = bool(getattr(args, "prompt", None))
|
|
111
|
+
except Exception:
|
|
112
|
+
_cli_resume_requested = False
|
|
113
|
+
_cli_headless = False
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _maybe_auto_resume() -> None:
|
|
118
|
+
"""Resume this pane's previous session unless the user asked otherwise.
|
|
119
|
+
|
|
120
|
+
Yields to an explicit ``-r`` / ``--quick-resume``, skips headless ``-p``
|
|
121
|
+
runs, and honours ``HERDR_NO_AUTO_RESUME=1`` as an escape hatch for
|
|
122
|
+
anyone who wants a deliberately fresh session in a reused pane.
|
|
123
|
+
"""
|
|
124
|
+
if _cli_resume_requested or _cli_headless:
|
|
125
|
+
return
|
|
126
|
+
if os.environ.get("HERDR_NO_AUTO_RESUME", "").strip().lower() in {
|
|
127
|
+
"1",
|
|
128
|
+
"true",
|
|
129
|
+
"yes",
|
|
130
|
+
"on",
|
|
131
|
+
}:
|
|
132
|
+
return
|
|
133
|
+
restore.resume_session(_client)
|
|
134
|
+
|
|
135
|
+
|
|
90
136
|
def _on_startup(*_args, **_kw) -> None:
|
|
91
137
|
_reporter.on_startup()
|
|
138
|
+
_maybe_auto_resume()
|
|
92
139
|
|
|
93
140
|
|
|
94
141
|
def _on_user_prompt(*_args, **_kw) -> None:
|
|
@@ -209,6 +256,7 @@ def _install_exit_guards() -> None:
|
|
|
209
256
|
|
|
210
257
|
|
|
211
258
|
if _reporter.active:
|
|
259
|
+
register_callback("handle_cli_args", _on_handle_cli_args)
|
|
212
260
|
register_callback("startup", _on_startup)
|
|
213
261
|
register_callback("user_prompt_submit", _on_user_prompt)
|
|
214
262
|
register_callback("agent_run_start", _on_run_start)
|
|
@@ -41,8 +41,9 @@ import threading
|
|
|
41
41
|
import time
|
|
42
42
|
from typing import Optional, Tuple
|
|
43
43
|
|
|
44
|
-
from .
|
|
44
|
+
from . import restore
|
|
45
45
|
from . import sources
|
|
46
|
+
from .client import HerdrClient
|
|
46
47
|
|
|
47
48
|
logger = logging.getLogger(__name__)
|
|
48
49
|
|
|
@@ -149,6 +150,10 @@ class HerdrReporter:
|
|
|
149
150
|
self._session_ref = ref
|
|
150
151
|
if changed:
|
|
151
152
|
self._client.report_session(ref[0], ref[1])
|
|
153
|
+
# Keep a local pane -> session map so a restored pane can resume
|
|
154
|
+
# this conversation even though herdr itself stores no reference
|
|
155
|
+
# for a non-official agent. See restore.py.
|
|
156
|
+
restore.remember_session(self._client.pane_id, ref[0], ref[1])
|
|
152
157
|
|
|
153
158
|
# -- lifecycle handlers (all sync; safe from async or worker threads) --
|
|
154
159
|
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""Resume the previous code-puppy session when re-entering a herdr pane.
|
|
2
|
+
|
|
3
|
+
herdr can resume *official* agent panes after a server restart by reading the
|
|
4
|
+
native session reference an integration reported -- but code-puppy is not an
|
|
5
|
+
official herdr integration today, so herdr stores nothing for us. (Verified
|
|
6
|
+
against herdr 0.9.1: ``pane.report_agent_session`` is accepted, but
|
|
7
|
+
``pane.get`` exposes no ``agent_session`` for the ``codepuppy`` agent, while
|
|
8
|
+
the same call for ``codex`` does.) This module makes code-puppy
|
|
9
|
+
self-sufficient:
|
|
10
|
+
|
|
11
|
+
* it keeps a tiny local **pane -> session map** under ``XDG_STATE_HOME``,
|
|
12
|
+
written whenever we report a session reference, so a restored pane can find
|
|
13
|
+
the conversation it was last running;
|
|
14
|
+
* on startup inside a herdr pane it resolves the previous session -- first
|
|
15
|
+
from herdr's own stored reference (forward-compatible with a future herdr
|
|
16
|
+
that recognises codepuppy), then from the local map -- and loads it into the
|
|
17
|
+
current agent, exactly like ``-r`` does.
|
|
18
|
+
|
|
19
|
+
State deliberately lives under ``XDG_STATE_HOME`` and never inside the plugin
|
|
20
|
+
directory: runtime state next to plugin code would self-tamper the plugin's
|
|
21
|
+
trust hash and demand re-acceptance on every boot.
|
|
22
|
+
|
|
23
|
+
Everything here is fail-soft. Restoring a session is a convenience; a broken
|
|
24
|
+
socket, a missing file, or an unreadable store must never block startup.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import json
|
|
30
|
+
import logging
|
|
31
|
+
import os
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from typing import Callable, Optional, Tuple
|
|
34
|
+
|
|
35
|
+
from .client import HerdrClient
|
|
36
|
+
|
|
37
|
+
try: # pragma: no cover - POSIX only
|
|
38
|
+
import fcntl
|
|
39
|
+
except ImportError: # pragma: no cover - Windows
|
|
40
|
+
fcntl = None
|
|
41
|
+
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
_STATE_FILENAME = "herdr_pane_sessions.json"
|
|
45
|
+
|
|
46
|
+
#: ``(session_name, session_dir)`` -- the durable autosave name plus the
|
|
47
|
+
#: directory its ``.json``/``.pkl`` file lives in.
|
|
48
|
+
SessionRef = Tuple[str, str]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _state_path() -> Optional[Path]:
|
|
52
|
+
"""The pane->session store path, or ``None`` when the dir is unavailable."""
|
|
53
|
+
try:
|
|
54
|
+
from code_puppy.config import STATE_DIR
|
|
55
|
+
|
|
56
|
+
return Path(STATE_DIR) / _STATE_FILENAME
|
|
57
|
+
except Exception:
|
|
58
|
+
logger.debug("herdr: state dir unavailable", exc_info=True)
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _read_store() -> dict:
|
|
63
|
+
"""Read the pane->session map. ``{}`` on any failure (never raises)."""
|
|
64
|
+
path = _state_path()
|
|
65
|
+
if path is None:
|
|
66
|
+
return {}
|
|
67
|
+
try:
|
|
68
|
+
with path.open(encoding="utf-8") as file:
|
|
69
|
+
data = json.load(file)
|
|
70
|
+
return data if isinstance(data, dict) else {}
|
|
71
|
+
except FileNotFoundError:
|
|
72
|
+
return {}
|
|
73
|
+
except Exception:
|
|
74
|
+
logger.debug("herdr: pane-session store unreadable", exc_info=True)
|
|
75
|
+
return {}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _write_store(store: dict) -> None:
|
|
79
|
+
"""Atomically write the map through a writer-private temp file.
|
|
80
|
+
|
|
81
|
+
Never raises: fail-soft is this module's contract, and both callers treat a
|
|
82
|
+
failed write as "we simply do not auto-resume next boot".
|
|
83
|
+
|
|
84
|
+
The temp name is scoped by PID on purpose. A shared ``.tmp`` name lets two
|
|
85
|
+
code-puppy processes interleave writes into the same file before either
|
|
86
|
+
renames it, which silently drops *other* panes' entries -- and herdr's
|
|
87
|
+
whole point is running many panes at once.
|
|
88
|
+
"""
|
|
89
|
+
path = _state_path()
|
|
90
|
+
if path is None:
|
|
91
|
+
return
|
|
92
|
+
tmp: Optional[Path] = None
|
|
93
|
+
try:
|
|
94
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
95
|
+
tmp = path.with_name(f"{path.name}.{os.getpid()}.tmp")
|
|
96
|
+
with tmp.open("w", encoding="utf-8") as file:
|
|
97
|
+
json.dump(store, file)
|
|
98
|
+
tmp.replace(path)
|
|
99
|
+
except Exception:
|
|
100
|
+
logger.debug("herdr: could not write pane-session store", exc_info=True)
|
|
101
|
+
if tmp is not None:
|
|
102
|
+
try:
|
|
103
|
+
tmp.unlink(missing_ok=True)
|
|
104
|
+
except Exception:
|
|
105
|
+
logger.debug("herdr: could not clean temp store", exc_info=True)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _locked_update(mutate: Callable[[dict], None]) -> None:
|
|
109
|
+
"""Run a read-modify-write of the store under an exclusive lock.
|
|
110
|
+
|
|
111
|
+
The store is shared by every code-puppy process on the box, so concurrent
|
|
112
|
+
writers are the *normal* case here. Without the lock a stale reader
|
|
113
|
+
clobbers a newer writer's entry, and that pane silently loses its
|
|
114
|
+
auto-resume -- the exact feature this module exists to provide. The lock
|
|
115
|
+
lives in a sibling ``.lock`` file so ``replace()`` never swaps it out from
|
|
116
|
+
under us. ``fcntl`` is POSIX-only; elsewhere we degrade to best effort
|
|
117
|
+
rather than crash. Never raises.
|
|
118
|
+
"""
|
|
119
|
+
path = _state_path()
|
|
120
|
+
if path is None:
|
|
121
|
+
return
|
|
122
|
+
try:
|
|
123
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
124
|
+
with path.with_name(path.name + ".lock").open("a+") as lock_file:
|
|
125
|
+
if fcntl is not None:
|
|
126
|
+
fcntl.flock(lock_file, fcntl.LOCK_EX)
|
|
127
|
+
try:
|
|
128
|
+
store = _read_store()
|
|
129
|
+
mutate(store)
|
|
130
|
+
_write_store(store)
|
|
131
|
+
finally:
|
|
132
|
+
if fcntl is not None:
|
|
133
|
+
fcntl.flock(lock_file, fcntl.LOCK_UN)
|
|
134
|
+
except Exception:
|
|
135
|
+
logger.debug("herdr: could not update pane-session map", exc_info=True)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def remember_session(
|
|
139
|
+
pane_id: Optional[str], session_name: str, session_path: str
|
|
140
|
+
) -> None:
|
|
141
|
+
"""Record ``pane_id -> (session_name, session_path)``.
|
|
142
|
+
|
|
143
|
+
Called from the reporter every time it reports a session reference, so the
|
|
144
|
+
map always reflects the pane's *current* session (a new session after
|
|
145
|
+
``/clear`` or ``/resume`` overwrites the stale entry). Any failure is
|
|
146
|
+
swallowed -- a missing map only costs us one auto-resume.
|
|
147
|
+
"""
|
|
148
|
+
if not pane_id or not session_name:
|
|
149
|
+
return
|
|
150
|
+
|
|
151
|
+
def _mutate(store: dict) -> None:
|
|
152
|
+
store[pane_id] = {
|
|
153
|
+
"session_name": session_name,
|
|
154
|
+
"session_path": str(session_path or ""),
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
_locked_update(_mutate)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def forget_session(pane_id: Optional[str]) -> None:
|
|
161
|
+
"""Drop ``pane_id``'s entry (used when its session is gone). Fail-soft."""
|
|
162
|
+
if not pane_id:
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
def _mutate(store: dict) -> None:
|
|
166
|
+
store.pop(pane_id, None)
|
|
167
|
+
|
|
168
|
+
_locked_update(_mutate)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _from_herdr(client: HerdrClient) -> Optional[SessionRef]:
|
|
172
|
+
"""herdr's own stored reference, if it has one for this pane.
|
|
173
|
+
|
|
174
|
+
Forward-compatible: on a herdr that recognises codepuppy (or grows a
|
|
175
|
+
custom-integration hook) this is the authoritative source. ``kind`` tells
|
|
176
|
+
us whether ``value`` is a bare session id or a file path.
|
|
177
|
+
"""
|
|
178
|
+
info = client.get_agent_session()
|
|
179
|
+
if not info:
|
|
180
|
+
return None
|
|
181
|
+
value = info.get("value")
|
|
182
|
+
if not isinstance(value, str) or not value:
|
|
183
|
+
return None
|
|
184
|
+
kind = info.get("kind")
|
|
185
|
+
if kind == "path":
|
|
186
|
+
path = Path(value)
|
|
187
|
+
return path.stem, str(path.parent)
|
|
188
|
+
# ``kind == "id"`` (or an unknown kind): a bare session name resolved
|
|
189
|
+
# against the standard autosave directory.
|
|
190
|
+
return value, ""
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _from_store(pane_id: Optional[str]) -> Optional[SessionRef]:
|
|
194
|
+
"""Our local pane->session map entry, if any."""
|
|
195
|
+
if not pane_id:
|
|
196
|
+
return None
|
|
197
|
+
entry = _read_store().get(pane_id)
|
|
198
|
+
if not isinstance(entry, dict):
|
|
199
|
+
return None
|
|
200
|
+
name = entry.get("session_name")
|
|
201
|
+
if not isinstance(name, str) or not name:
|
|
202
|
+
return None
|
|
203
|
+
stored_path = entry.get("session_path")
|
|
204
|
+
parent = ""
|
|
205
|
+
if isinstance(stored_path, str) and stored_path:
|
|
206
|
+
parent = str(Path(stored_path).parent)
|
|
207
|
+
return name, parent
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def resolve_stored_session(client: HerdrClient) -> Optional[SessionRef]:
|
|
211
|
+
"""Resolve the session this pane last ran: herdr ref first, local map second."""
|
|
212
|
+
return _from_herdr(client) or _from_store(client.pane_id)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def resume_session(client: HerdrClient) -> bool:
|
|
216
|
+
"""Load this pane's previous session into the current agent.
|
|
217
|
+
|
|
218
|
+
Returns ``True`` only when history was actually restored. Any failure --
|
|
219
|
+
no stored reference, a vanished file, an unreadable store -- returns
|
|
220
|
+
``False`` so startup simply proceeds as a fresh session. Never raises.
|
|
221
|
+
"""
|
|
222
|
+
if not client.active:
|
|
223
|
+
return False
|
|
224
|
+
ref = resolve_stored_session(client)
|
|
225
|
+
if ref is None:
|
|
226
|
+
return False
|
|
227
|
+
session_name, session_dir = ref
|
|
228
|
+
|
|
229
|
+
try:
|
|
230
|
+
from code_puppy.agents.agent_manager import get_current_agent
|
|
231
|
+
from code_puppy.config import AUTOSAVE_DIR, pin_current_session_name
|
|
232
|
+
from code_puppy.session_storage import load_session
|
|
233
|
+
|
|
234
|
+
base_dir = Path(session_dir) if session_dir else Path(AUTOSAVE_DIR)
|
|
235
|
+
history = load_session(session_name, base_dir)
|
|
236
|
+
except FileNotFoundError:
|
|
237
|
+
logger.debug("herdr: stored session %s is gone", session_name)
|
|
238
|
+
forget_session(client.pane_id)
|
|
239
|
+
return False
|
|
240
|
+
except Exception:
|
|
241
|
+
logger.debug("herdr: could not load stored session", exc_info=True)
|
|
242
|
+
return False
|
|
243
|
+
|
|
244
|
+
if not history:
|
|
245
|
+
# An empty lazy-created session is not worth "resuming".
|
|
246
|
+
return False
|
|
247
|
+
|
|
248
|
+
try:
|
|
249
|
+
agent = get_current_agent()
|
|
250
|
+
agent.set_message_history(list(history))
|
|
251
|
+
pin_current_session_name(session_name)
|
|
252
|
+
except Exception:
|
|
253
|
+
logger.debug("herdr: could not adopt stored session", exc_info=True)
|
|
254
|
+
return False
|
|
255
|
+
|
|
256
|
+
_announce(session_name, history)
|
|
257
|
+
return True
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _announce(session_name: str, history: list) -> None:
|
|
261
|
+
"""Tell the user their pane's session came back. Best-effort."""
|
|
262
|
+
try:
|
|
263
|
+
from code_puppy.messaging import emit_success
|
|
264
|
+
|
|
265
|
+
emit_success(
|
|
266
|
+
f"herdr: resumed session '{session_name}' ({len(history)} messages)"
|
|
267
|
+
)
|
|
268
|
+
except Exception:
|
|
269
|
+
logger.debug("herdr: could not announce resume", exc_info=True)
|
|
270
|
+
try:
|
|
271
|
+
from code_puppy.command_line.autosave_menu import display_resumed_history
|
|
272
|
+
|
|
273
|
+
display_resumed_history(history)
|
|
274
|
+
except Exception:
|
|
275
|
+
logger.debug("herdr: could not display resumed history", exc_info=True)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
__all__ = [
|
|
279
|
+
"SessionRef",
|
|
280
|
+
"remember_session",
|
|
281
|
+
"forget_session",
|
|
282
|
+
"resolve_stored_session",
|
|
283
|
+
"resume_session",
|
|
284
|
+
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|