code-puppy-core-plugins 0.0.12__tar.gz → 0.0.13__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.12 → code_puppy_core_plugins-0.0.13}/PKG-INFO +1 -1
- code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/__init__.py +7 -0
- code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/mirror.py +108 -0
- code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/query.py +119 -0
- code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +138 -0
- code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/sync.py +153 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/pyproject.toml +2 -1
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/command_cache.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wide_completion_menu/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/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.13
|
|
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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Mirror Code Puppy chat sessions into Logfire as structured log records.
|
|
2
|
+
|
|
3
|
+
The record schema lives under the ``cp.hist.*`` namespace -- deliberately NOT
|
|
4
|
+
``cp.session.*``. Logfire's hosted MCP query path scrubs keys and values that
|
|
5
|
+
contain sensitive keywords, and "session" is on that list, which would render
|
|
6
|
+
every listing useless and corrupt restored payloads.
|
|
7
|
+
"""
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""Write path: mirror a saved session envelope into Logfire records.
|
|
2
|
+
|
|
3
|
+
Called from the ``post_autosave`` hook. Local JSON stays canonical; Logfire is
|
|
4
|
+
a roaming/backup layer. Everything here raises on failure -- the hook wrapper
|
|
5
|
+
owns the fail-soft policy.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import subprocess
|
|
11
|
+
from functools import lru_cache
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from . import sync
|
|
16
|
+
|
|
17
|
+
_CONFIGURED = False
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _configure_once() -> None:
|
|
21
|
+
"""Point the logfire SDK at the onboarded project's write token."""
|
|
22
|
+
global _CONFIGURED
|
|
23
|
+
if _CONFIGURED:
|
|
24
|
+
return
|
|
25
|
+
import logfire
|
|
26
|
+
|
|
27
|
+
from ..logfire_oauth.oauth import load_project_credentials
|
|
28
|
+
|
|
29
|
+
credentials = load_project_credentials()
|
|
30
|
+
if credentials is None:
|
|
31
|
+
raise RuntimeError("no Logfire project credentials; run /logfire onboard")
|
|
32
|
+
logfire.configure(
|
|
33
|
+
service_name="code-puppy",
|
|
34
|
+
token=credentials.token,
|
|
35
|
+
send_to_logfire="always",
|
|
36
|
+
console=False,
|
|
37
|
+
)
|
|
38
|
+
_CONFIGURED = True
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@lru_cache(maxsize=8)
|
|
42
|
+
def _git(args: tuple[str, ...], cwd: str) -> str | None:
|
|
43
|
+
try:
|
|
44
|
+
result = subprocess.run(
|
|
45
|
+
("git", *args),
|
|
46
|
+
capture_output=True,
|
|
47
|
+
text=True,
|
|
48
|
+
cwd=cwd,
|
|
49
|
+
timeout=5,
|
|
50
|
+
check=False,
|
|
51
|
+
)
|
|
52
|
+
except (OSError, subprocess.TimeoutExpired):
|
|
53
|
+
return None
|
|
54
|
+
return result.stdout.strip() or None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def workspace_metadata() -> dict[str, str | None]:
|
|
58
|
+
"""Best-effort workspace identity: resolved cwd, git remote, branch.
|
|
59
|
+
|
|
60
|
+
``remote`` is the cross-machine join key (paths differ between machines);
|
|
61
|
+
``scope_key`` is the machine-local grouping used by session resume.
|
|
62
|
+
"""
|
|
63
|
+
cwd = str(Path.cwd())
|
|
64
|
+
return {
|
|
65
|
+
"scope_key": cwd,
|
|
66
|
+
"project_name": Path(cwd).name or None,
|
|
67
|
+
"remote": _git(("remote", "get-url", "origin"), cwd),
|
|
68
|
+
"branch": _git(("rev-parse", "--abbrev-ref", "HEAD"), cwd),
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def mirror_session(metadata: Any) -> tuple[int, int]:
|
|
73
|
+
"""Emit not-yet-synced messages of a saved session. Returns (emitted, total)."""
|
|
74
|
+
from code_puppy.session_storage import read_envelope_file
|
|
75
|
+
|
|
76
|
+
envelope = read_envelope_file(Path(metadata.json_path))
|
|
77
|
+
messages = envelope.get("messages") or []
|
|
78
|
+
fps = [sync.fingerprint(message) for message in messages]
|
|
79
|
+
|
|
80
|
+
key = f"{metadata.scope_key or ''}/{metadata.session_name}"
|
|
81
|
+
state = sync.load_state()
|
|
82
|
+
previous = (state["sessions"].get(key) or {}).get("fingerprints")
|
|
83
|
+
start = sync.plan_sync(previous, fps)
|
|
84
|
+
if start >= len(messages):
|
|
85
|
+
return 0, len(messages)
|
|
86
|
+
|
|
87
|
+
meta = workspace_metadata()
|
|
88
|
+
_configure_once()
|
|
89
|
+
import logfire
|
|
90
|
+
|
|
91
|
+
emitted = 0
|
|
92
|
+
for seq in range(start, len(messages)):
|
|
93
|
+
for attrs in sync.encode_message_records(
|
|
94
|
+
name=metadata.session_name,
|
|
95
|
+
seq=seq,
|
|
96
|
+
message=messages[seq],
|
|
97
|
+
scope_key=meta["scope_key"],
|
|
98
|
+
project_name=meta["project_name"],
|
|
99
|
+
remote=meta["remote"],
|
|
100
|
+
branch=meta["branch"],
|
|
101
|
+
):
|
|
102
|
+
logfire.info("cp.hist.message", **attrs)
|
|
103
|
+
emitted += 1
|
|
104
|
+
logfire.force_flush()
|
|
105
|
+
|
|
106
|
+
state["sessions"][key] = sync.synced_entry(fps)
|
|
107
|
+
sync.save_state(state)
|
|
108
|
+
return emitted, len(messages)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Read path: list sessions that have been mirrored into Logfire.
|
|
2
|
+
|
|
3
|
+
Listing goes through Logfire's hosted MCP ``query_run`` tool -- the exact same
|
|
4
|
+
path as the agent-facing ``logfire_query`` tool. Two consequences:
|
|
5
|
+
|
|
6
|
+
* The MCP layer scrubs keys/values containing sensitive keywords. The
|
|
7
|
+
``cp.hist.*`` namespace dodges key-based scrubbing; occasional value-level
|
|
8
|
+
scrubbing in previews is cosmetic for a list view.
|
|
9
|
+
* Machine restore must NOT use this path (payloads would silently corrupt).
|
|
10
|
+
Restore belongs behind a minted read token + ``/v2/query`` once the OAuth
|
|
11
|
+
scope question is settled.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import dataclasses
|
|
17
|
+
import time
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
import httpx
|
|
21
|
+
|
|
22
|
+
LIST_SESSIONS_SQL = """
|
|
23
|
+
SELECT
|
|
24
|
+
attributes->>'cp.hist.name' AS name,
|
|
25
|
+
attributes->>'cp.project.name' AS project,
|
|
26
|
+
attributes->>'cp.project.remote' AS remote,
|
|
27
|
+
count(DISTINCT attributes->>'cp.hist.seq') AS messages,
|
|
28
|
+
max(start_timestamp) AS last_active
|
|
29
|
+
FROM records
|
|
30
|
+
WHERE attributes->>'cp.hist.name' IS NOT NULL
|
|
31
|
+
GROUP BY 1, 2, 3
|
|
32
|
+
ORDER BY max(start_timestamp) DESC
|
|
33
|
+
LIMIT {limit}
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class SessionsQueryError(RuntimeError):
|
|
38
|
+
"""Raised when sessions cannot be listed from Logfire."""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def fresh_tokens() -> Any:
|
|
42
|
+
"""Return usable OAuth tokens, refreshing them when expired.
|
|
43
|
+
|
|
44
|
+
Mirrors RFC 6749's refresh grant against the token endpoint discovered via
|
|
45
|
+
RFC 8414 -- the same discovery the device flow uses. Refreshed tokens are
|
|
46
|
+
persisted so other consumers stay warm.
|
|
47
|
+
"""
|
|
48
|
+
from ..logfire_oauth.oauth import load_tokens, save_tokens
|
|
49
|
+
|
|
50
|
+
tokens = load_tokens()
|
|
51
|
+
if tokens is None:
|
|
52
|
+
raise SessionsQueryError(
|
|
53
|
+
"Logfire is not authenticated. Run /logfire auth first."
|
|
54
|
+
)
|
|
55
|
+
if tokens.expires_at > time.time() + 30:
|
|
56
|
+
return tokens
|
|
57
|
+
if not tokens.refresh_token:
|
|
58
|
+
raise SessionsQueryError(
|
|
59
|
+
"The Logfire OAuth access token expired and cannot be refreshed. "
|
|
60
|
+
"Run /logfire auth again."
|
|
61
|
+
)
|
|
62
|
+
try:
|
|
63
|
+
with httpx.Client(timeout=30) as client:
|
|
64
|
+
metadata = client.get(
|
|
65
|
+
f"{tokens.base_url}/.well-known/oauth-authorization-server"
|
|
66
|
+
)
|
|
67
|
+
metadata.raise_for_status()
|
|
68
|
+
token_endpoint = metadata.json()["token_endpoint"]
|
|
69
|
+
response = client.post(
|
|
70
|
+
token_endpoint,
|
|
71
|
+
data={
|
|
72
|
+
"grant_type": "refresh_token",
|
|
73
|
+
"client_id": tokens.client_id,
|
|
74
|
+
"refresh_token": tokens.refresh_token,
|
|
75
|
+
},
|
|
76
|
+
)
|
|
77
|
+
response.raise_for_status()
|
|
78
|
+
payload = response.json()
|
|
79
|
+
except (httpx.HTTPError, KeyError, ValueError) as exc:
|
|
80
|
+
raise SessionsQueryError(
|
|
81
|
+
f"Could not refresh the Logfire access token: {type(exc).__name__}"
|
|
82
|
+
) from exc
|
|
83
|
+
|
|
84
|
+
tokens = dataclasses.replace(
|
|
85
|
+
tokens,
|
|
86
|
+
access_token=payload["access_token"],
|
|
87
|
+
expires_at=time.time() + float(payload.get("expires_in", 300)),
|
|
88
|
+
refresh_token=payload.get("refresh_token") or tokens.refresh_token,
|
|
89
|
+
)
|
|
90
|
+
save_tokens(tokens)
|
|
91
|
+
return tokens
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def list_sessions(limit: int = 25) -> list[dict[str, Any]]:
|
|
95
|
+
"""Return mirrored sessions ordered by most recent activity."""
|
|
96
|
+
from ..logfire_oauth.oauth import load_project_credentials
|
|
97
|
+
from ..logfire_oauth.query_tool import _query_mcp
|
|
98
|
+
|
|
99
|
+
credentials = load_project_credentials()
|
|
100
|
+
if credentials is None:
|
|
101
|
+
raise SessionsQueryError(
|
|
102
|
+
"No Logfire project is configured. Run /logfire onboard first."
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
tokens = fresh_tokens()
|
|
106
|
+
result = _query_mcp(
|
|
107
|
+
base_url=tokens.base_url,
|
|
108
|
+
access_token=tokens.access_token,
|
|
109
|
+
query=LIST_SESSIONS_SQL.format(limit=limit),
|
|
110
|
+
project=credentials.project_name,
|
|
111
|
+
start=None,
|
|
112
|
+
end=None,
|
|
113
|
+
)
|
|
114
|
+
if isinstance(result, dict) and result.get("error"):
|
|
115
|
+
raise SessionsQueryError(str(result["error"]))
|
|
116
|
+
rows = result.get("rows") if isinstance(result, dict) else None
|
|
117
|
+
if rows is None:
|
|
118
|
+
raise SessionsQueryError("Unexpected response from the Logfire query API.")
|
|
119
|
+
return rows
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""Register the Logfire session-mirroring plugin.
|
|
2
|
+
|
|
3
|
+
Opt-in by design: mirroring ships full chat histories to the user's own
|
|
4
|
+
Logfire project, so it stays off until ``enable_logfire_sessions`` is set
|
|
5
|
+
(via ``/set`` or ``/logfire-sessions on``) AND a project write token exists
|
|
6
|
+
(from ``/logfire onboard``).
|
|
7
|
+
|
|
8
|
+
``post_autosave`` is a decorative hook surface: a misbehaving mirror must
|
|
9
|
+
never poison the save path, so every failure is swallowed here.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import traceback
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from code_puppy.callbacks import register_callback
|
|
18
|
+
from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
|
|
19
|
+
|
|
20
|
+
COMMAND_NAMES = {"logfire-sessions"}
|
|
21
|
+
|
|
22
|
+
_PULL_STUB = (
|
|
23
|
+
"Restoring sessions from Logfire is not implemented yet. It needs a "
|
|
24
|
+
"read token (the hosted MCP query path scrubs values containing words "
|
|
25
|
+
"like 'session', which would corrupt restored payloads). Prerequisite: "
|
|
26
|
+
"extend ONBOARD_SCOPES with read-token minting permission, then pull via "
|
|
27
|
+
"POST /v2/query and rebuild the envelope locally."
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _enabled() -> bool:
|
|
32
|
+
from code_puppy.config import get_value
|
|
33
|
+
|
|
34
|
+
return str(get_value("enable_logfire_sessions") or "").strip().lower() in {
|
|
35
|
+
"1",
|
|
36
|
+
"true",
|
|
37
|
+
"yes",
|
|
38
|
+
"on",
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _on_post_autosave(metadata: Any) -> None:
|
|
43
|
+
"""Mirror the just-saved session into Logfire. Never raises."""
|
|
44
|
+
try:
|
|
45
|
+
if not _enabled():
|
|
46
|
+
return
|
|
47
|
+
from .mirror import mirror_session
|
|
48
|
+
|
|
49
|
+
emitted, total = mirror_session(metadata)
|
|
50
|
+
if emitted:
|
|
51
|
+
emit_info(
|
|
52
|
+
f"Mirrored {emitted} new message(s) of '{metadata.session_name}' "
|
|
53
|
+
f"to Logfire ({total} total)."
|
|
54
|
+
)
|
|
55
|
+
except Exception:
|
|
56
|
+
traceback.print_exc() # forensics only; the save path must not care
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _status() -> None:
|
|
60
|
+
from ..logfire_oauth.oauth import load_project_credentials
|
|
61
|
+
|
|
62
|
+
if not _enabled():
|
|
63
|
+
emit_warning("Session mirroring is disabled (/logfire-sessions on).")
|
|
64
|
+
else:
|
|
65
|
+
emit_info("Session mirroring: enabled")
|
|
66
|
+
credentials = load_project_credentials()
|
|
67
|
+
if credentials is None:
|
|
68
|
+
emit_warning("No Logfire write token (/logfire onboard first).")
|
|
69
|
+
else:
|
|
70
|
+
emit_info(f"Write-token project: {credentials.project_name}")
|
|
71
|
+
from . import sync
|
|
72
|
+
|
|
73
|
+
state = sync.load_state()
|
|
74
|
+
sessions = state.get("sessions", {})
|
|
75
|
+
emit_info(f"Locally synced sessions: {len(sessions)}")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _list(limit: int) -> None:
|
|
79
|
+
from .query import SessionsQueryError, list_sessions
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
rows = list_sessions(limit=limit)
|
|
83
|
+
except SessionsQueryError as exc:
|
|
84
|
+
emit_error(str(exc))
|
|
85
|
+
return
|
|
86
|
+
if not rows:
|
|
87
|
+
emit_info("No mirrored sessions found in Logfire.")
|
|
88
|
+
return
|
|
89
|
+
emit_info(f"Mirrored sessions ({len(rows)}):")
|
|
90
|
+
for row in rows:
|
|
91
|
+
project = row.get("project") or "?"
|
|
92
|
+
remote = row.get("remote") or "-"
|
|
93
|
+
name = row.get("name") or "?"
|
|
94
|
+
messages = row.get("messages", "?")
|
|
95
|
+
last_active = str(row.get("last_active", ""))[:19]
|
|
96
|
+
emit_info(f" {name} [{project}] {messages} msgs {last_active} {remote}")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _handle(command: str, name: str) -> bool | None:
|
|
100
|
+
if name not in COMMAND_NAMES:
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
from code_puppy.config import set_value
|
|
104
|
+
|
|
105
|
+
parts = command.split()[1:]
|
|
106
|
+
action = parts[0].lower() if parts else "status"
|
|
107
|
+
args = parts[1:]
|
|
108
|
+
|
|
109
|
+
if action == "on":
|
|
110
|
+
set_value("enable_logfire_sessions", "true")
|
|
111
|
+
emit_success("Logfire session mirroring enabled.")
|
|
112
|
+
elif action == "off":
|
|
113
|
+
set_value("enable_logfire_sessions", "false")
|
|
114
|
+
emit_success("Logfire session mirroring disabled.")
|
|
115
|
+
elif action == "list":
|
|
116
|
+
limit = int(args[0]) if args and args[0].isdigit() else 25
|
|
117
|
+
_list(min(limit, 100))
|
|
118
|
+
elif action == "pull":
|
|
119
|
+
emit_warning(_PULL_STUB)
|
|
120
|
+
elif action == "status":
|
|
121
|
+
_status()
|
|
122
|
+
else:
|
|
123
|
+
emit_info("Usage: /logfire-sessions [status|on|off|list [limit]|pull]")
|
|
124
|
+
return True
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _help() -> list[tuple[str, str]]:
|
|
128
|
+
return [
|
|
129
|
+
(
|
|
130
|
+
"logfire-sessions",
|
|
131
|
+
"Mirror chat sessions to Logfire; status/on/off/list/pull",
|
|
132
|
+
)
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
register_callback("post_autosave", _on_post_autosave)
|
|
137
|
+
register_callback("custom_command_help", _help)
|
|
138
|
+
register_callback("custom_command", _handle)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""Pure encode/decode/state logic for mirroring sessions into Logfire.
|
|
2
|
+
|
|
3
|
+
No I/O beyond the sync-state JSON file, so everything here is unit-testable
|
|
4
|
+
without a Logfire project or network.
|
|
5
|
+
|
|
6
|
+
Record shape (one log record per message chunk)::
|
|
7
|
+
|
|
8
|
+
cp.hist.name session file stem
|
|
9
|
+
cp.hist.seq message index within the history
|
|
10
|
+
cp.hist.chunk "i/n" -- gzipped base64 payload chunk i of n
|
|
11
|
+
cp.hist.payload one base64(gzip(json(message))) chunk
|
|
12
|
+
cp.hist.scope_key resolved cwd of the session (compute_scope_key)
|
|
13
|
+
cp.project.name / remote / branch best-effort workspace metadata
|
|
14
|
+
|
|
15
|
+
Restore-side note: histories can be re-synced after compaction, so Logfire may
|
|
16
|
+
hold multiple versions of the same seq. :func:`decode_message_rows` therefore
|
|
17
|
+
deduplicates by ``seq``, keeping the *latest* row.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import base64
|
|
23
|
+
import gzip
|
|
24
|
+
import hashlib
|
|
25
|
+
import json
|
|
26
|
+
import time
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any, Iterable
|
|
29
|
+
|
|
30
|
+
CHUNK_CHARS = 16_000 # conservative attribute-size budget per record
|
|
31
|
+
STATE_VERSION = 1
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def fingerprint(message: Any) -> str:
|
|
35
|
+
"""Stable sha256 for one jsonable pydantic-ai message."""
|
|
36
|
+
canonical = json.dumps(message, sort_keys=True, separators=(",", ":"))
|
|
37
|
+
return hashlib.sha256(canonical.encode()).hexdigest()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def plan_sync(previous: list[str] | None, current: list[str]) -> int:
|
|
41
|
+
"""Return the index in ``current`` to start emitting from.
|
|
42
|
+
|
|
43
|
+
Append-only growth continues where the last sync stopped. Anything else
|
|
44
|
+
(divergence from compaction/branching, or a shrunken history) triggers a
|
|
45
|
+
full re-emit; Logfire keeps both generations and restore dedupes by seq.
|
|
46
|
+
"""
|
|
47
|
+
if not previous:
|
|
48
|
+
return 0
|
|
49
|
+
overlap = min(len(previous), len(current))
|
|
50
|
+
if previous[:overlap] == current[:overlap]:
|
|
51
|
+
return max(overlap, 0) if len(current) >= len(previous) else 0
|
|
52
|
+
return 0
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _chunk_b64(payload: bytes) -> list[str]:
|
|
56
|
+
blob = base64.b64encode(gzip.compress(payload)).decode()
|
|
57
|
+
return [blob[i : i + CHUNK_CHARS] for i in range(0, len(blob), CHUNK_CHARS)]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def encode_message_records(
|
|
61
|
+
*,
|
|
62
|
+
name: str,
|
|
63
|
+
seq: int,
|
|
64
|
+
message: Any,
|
|
65
|
+
scope_key: str | None,
|
|
66
|
+
project_name: str | None,
|
|
67
|
+
remote: str | None,
|
|
68
|
+
branch: str | None,
|
|
69
|
+
) -> list[dict[str, Any]]:
|
|
70
|
+
"""Encode one jsonable message as the Logfire records that carry it."""
|
|
71
|
+
body = json.dumps(message, separators=(",", ":")).encode()
|
|
72
|
+
chunks = _chunk_b64(body)
|
|
73
|
+
total = len(chunks)
|
|
74
|
+
records = []
|
|
75
|
+
for index, chunk in enumerate(chunks):
|
|
76
|
+
attrs: dict[str, Any] = {
|
|
77
|
+
"cp.hist.name": name,
|
|
78
|
+
"cp.hist.seq": seq,
|
|
79
|
+
"cp.hist.chunk": f"{index}/{total}",
|
|
80
|
+
"cp.hist.payload": chunk,
|
|
81
|
+
}
|
|
82
|
+
if scope_key:
|
|
83
|
+
attrs["cp.hist.scope_key"] = scope_key
|
|
84
|
+
if project_name:
|
|
85
|
+
attrs["cp.project.name"] = project_name
|
|
86
|
+
if remote:
|
|
87
|
+
attrs["cp.project.remote"] = remote
|
|
88
|
+
if branch:
|
|
89
|
+
attrs["cp.project.branch"] = branch
|
|
90
|
+
records.append(attrs)
|
|
91
|
+
return records
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def decode_message_rows(rows: Iterable[dict[str, Any]]) -> list[Any]:
|
|
95
|
+
"""Rebuild the messages list from normalized rows.
|
|
96
|
+
|
|
97
|
+
Each row is ``{"attributes": {...}, "timestamp": float | None}``. Rows
|
|
98
|
+
sharing a ``seq`` are joined along their chunk index; when a seq appears
|
|
99
|
+
more than once (re-synced history), the latest timestamp wins.
|
|
100
|
+
"""
|
|
101
|
+
by_seq: dict[int, tuple[float, dict[int, str]]] = {}
|
|
102
|
+
for row in rows:
|
|
103
|
+
attrs = row.get("attributes") or {}
|
|
104
|
+
name = attrs.get("cp.hist.name")
|
|
105
|
+
if name is None or "cp.hist.seq" not in attrs:
|
|
106
|
+
continue
|
|
107
|
+
seq = int(attrs["cp.hist.seq"])
|
|
108
|
+
chunk_index, _, _ = str(attrs.get("cp.hist.chunk", "0/1")).partition("/")
|
|
109
|
+
timestamp = float(row.get("timestamp") or 0.0)
|
|
110
|
+
seen_ts, chunks = by_seq.get(seq, (-1.0, {}))
|
|
111
|
+
if timestamp >= seen_ts:
|
|
112
|
+
# Later generations of a re-synced seq win, regardless of row order.
|
|
113
|
+
chunks[int(chunk_index)] = attrs.get("cp.hist.payload", "")
|
|
114
|
+
by_seq[seq] = (max(seen_ts, timestamp), chunks)
|
|
115
|
+
|
|
116
|
+
messages: list[Any] = []
|
|
117
|
+
for seq in sorted(by_seq):
|
|
118
|
+
chunks = by_seq[seq][1]
|
|
119
|
+
blob = "".join(chunks[i] for i in range(len(chunks)))
|
|
120
|
+
raw = gzip.decompress(base64.b64decode(blob))
|
|
121
|
+
messages.append(json.loads(raw))
|
|
122
|
+
return messages
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def state_path() -> Path:
|
|
126
|
+
"""Sync bookkeeping lives user-side, never next to plugin code (the trust
|
|
127
|
+
hash covers the plugin directory; writing runtime state there would
|
|
128
|
+
self-tamper and demand re-acceptance on every boot)."""
|
|
129
|
+
return Path.home() / ".code_puppy" / "logfire_session_sync.json"
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def load_state() -> dict[str, Any]:
|
|
133
|
+
try:
|
|
134
|
+
state = json.loads(state_path().read_text(encoding="utf-8"))
|
|
135
|
+
except (FileNotFoundError, OSError, json.JSONDecodeError):
|
|
136
|
+
return {"version": STATE_VERSION, "sessions": {}}
|
|
137
|
+
if not isinstance(state.get("sessions"), dict):
|
|
138
|
+
return {"version": STATE_VERSION, "sessions": {}}
|
|
139
|
+
return state
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def save_state(state: dict[str, Any]) -> None:
|
|
143
|
+
path = state_path()
|
|
144
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
145
|
+
path.write_text(json.dumps(state, indent=2), encoding="utf-8")
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def synced_entry(fingerprints: list[str]) -> dict[str, Any]:
|
|
149
|
+
return {
|
|
150
|
+
"fingerprints": fingerprints,
|
|
151
|
+
"message_count": len(fingerprints),
|
|
152
|
+
"synced_at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
|
|
153
|
+
}
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-puppy-core-plugins"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.13"
|
|
8
8
|
description = "Official plugin bundle for Code Puppy"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
@@ -57,6 +57,7 @@ herdr = "code_puppy_core_plugins.herdr.register_callbacks"
|
|
|
57
57
|
hook_creator = "code_puppy_core_plugins.hook_creator.register_callbacks"
|
|
58
58
|
hook_manager = "code_puppy_core_plugins.hook_manager.register_callbacks"
|
|
59
59
|
logfire_oauth = "code_puppy_core_plugins.logfire_oauth.register_callbacks"
|
|
60
|
+
logfire_sessions = "code_puppy_core_plugins.logfire_sessions.register_callbacks"
|
|
60
61
|
meta_oauth = "code_puppy_core_plugins.meta_oauth.register_callbacks"
|
|
61
62
|
namespace_skill_search = "code_puppy_core_plugins.namespace_skill_search.register_callbacks"
|
|
62
63
|
no_tools = "code_puppy_core_plugins.no_tools.register_callbacks"
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|