code-puppy-core-plugins 0.0.66__tar.gz → 0.0.68__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.66 → code_puppy_core_plugins-0.0.68}/PKG-INFO +2 -2
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +8 -3
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/__init__.py +1 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/chunks.py +269 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/config.py +55 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/judge.py +102 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/locales/en-US.json +3 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/register_callbacks.py +54 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/retrieve.py +90 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/search.py +187 -0
- code_puppy_core_plugins-0.0.68/code_puppy_core_plugins/jev_grep/tool.py +121 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/pyproject.toml +3 -2
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/background_agents/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/restore.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/profiles/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/profiles/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/profiles/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/profiles/menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.66 → code_puppy_core_plugins-0.0.68}/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.68
|
|
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
|
|
@@ -15,7 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Requires-Python: <3.15,>=3.11
|
|
17
17
|
Requires-Dist: httpx<1,>=0.24.1
|
|
18
|
-
Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai]<3,>=2.
|
|
18
|
+
Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai,typesafe]<3,>=2.51.0
|
|
19
19
|
Description-Content-Type: text/markdown
|
|
20
20
|
|
|
21
21
|
# Code Puppy Core Plugins
|
|
@@ -98,8 +98,9 @@ def create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
|
|
|
98
98
|
if verify is None:
|
|
99
99
|
verify = get_cert_bundle_path()
|
|
100
100
|
|
|
101
|
-
# No HTTP/2 for OAuth:
|
|
102
|
-
#
|
|
101
|
+
# No HTTP/2 for OAuth: kept as a precaution from core cfff821b4, which fixed
|
|
102
|
+
# zlib decompression errors caused by rewriting response streams to strip
|
|
103
|
+
# the ``cp_`` prefix. Responses are no longer rewritten -- see below.
|
|
103
104
|
kwargs = {}
|
|
104
105
|
# Plugin releases land before core. Old transports keep their legacy path.
|
|
105
106
|
import inspect
|
|
@@ -116,7 +117,11 @@ def create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
|
|
|
116
117
|
timeout=180,
|
|
117
118
|
http2=False,
|
|
118
119
|
# Claude Code OAuth requires the ``cp_`` tool-name prefix; the wire
|
|
119
|
-
# format Anthropic's CLI uses won't accept un-prefixed tools.
|
|
120
|
+
# format Anthropic's CLI uses won't accept un-prefixed tools. Only
|
|
121
|
+
# requests are rewritten: returned ``cp_*`` calls are mapped back to
|
|
122
|
+
# real tool names at dispatch by core's pydantic_patches
|
|
123
|
+
# (``_normalize_claude_code_tool_name``), so this model needs
|
|
124
|
+
# ``apply_all_patches()`` -- cli_runner applies it at import.
|
|
120
125
|
apply_claude_code_prefix=True,
|
|
121
126
|
oauth_reauthentication_callback=lambda: _reauthenticate_after_expired_oauth(
|
|
122
127
|
model_name
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Semantic code search powered by TypeSafe's Jev decision model."""
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"""Discovery and chunking: turn a directory into judgeable source snippets.
|
|
2
|
+
|
|
3
|
+
Python files are split along the
|
|
4
|
+
AST (functions and methods stay whole; declarations longer than
|
|
5
|
+
``SPLIT_LINES`` are split into the blocks inside them so each snippet is one
|
|
6
|
+
behaviour). Every other file falls back to overlapping line windows. Line
|
|
7
|
+
coverage is exact: every non-blank line lands in at least one snippet.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import ast
|
|
13
|
+
import os
|
|
14
|
+
import subprocess
|
|
15
|
+
from collections import Counter
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
|
|
18
|
+
from code_puppy.tools.ripgrep import find_ripgrep
|
|
19
|
+
|
|
20
|
+
# Discovery is bounded by files and bytes only. Snippet count is not capped:
|
|
21
|
+
# only the ranked shortlist is judged, and local BM25 over the ~24k snippets
|
|
22
|
+
# of a repo root takes well under a second.
|
|
23
|
+
MAX_FILES = 20_000
|
|
24
|
+
MAX_FILE_BYTES = 1024 * 1024
|
|
25
|
+
MAX_TOTAL_BYTES = 32 * 1024 * 1024
|
|
26
|
+
MAX_CHUNK_CHARS = 12_000
|
|
27
|
+
WHOLE_DECLARATION_LINES = 160
|
|
28
|
+
SPLIT_LINES = 24
|
|
29
|
+
WINDOW, OVERLAP = 60, 10
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class LineTooLong(ValueError):
|
|
33
|
+
"""A single line is too long to judge (minified or generated source)."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass(frozen=True)
|
|
37
|
+
class Chunk:
|
|
38
|
+
path: str
|
|
39
|
+
line: int
|
|
40
|
+
end_line: int
|
|
41
|
+
text: str
|
|
42
|
+
symbol: str | None = None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass
|
|
46
|
+
class Discovery:
|
|
47
|
+
chunks: list[Chunk] = field(default_factory=list)
|
|
48
|
+
files: int = 0
|
|
49
|
+
skipped: list[tuple[str, str]] = field(default_factory=list)
|
|
50
|
+
parsers: Counter = field(default_factory=Counter)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class _Range:
|
|
55
|
+
start: int
|
|
56
|
+
end: int
|
|
57
|
+
symbol: str | None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def windows(
|
|
61
|
+
lines: list[str],
|
|
62
|
+
path: str,
|
|
63
|
+
first_line: int = 1,
|
|
64
|
+
size: int = WINDOW,
|
|
65
|
+
overlap: int = OVERLAP,
|
|
66
|
+
symbol: str | None = None,
|
|
67
|
+
) -> list[Chunk]:
|
|
68
|
+
"""Fixed-size line windows; giant windows are halved, never clipped."""
|
|
69
|
+
out: list[Chunk] = []
|
|
70
|
+
step = size - overlap
|
|
71
|
+
for i in range(0, max(len(lines), 1), step):
|
|
72
|
+
part = lines[i : i + size]
|
|
73
|
+
text = "\n".join(part)
|
|
74
|
+
if len(text) > MAX_CHUNK_CHARS:
|
|
75
|
+
if size == 1:
|
|
76
|
+
raise LineTooLong(
|
|
77
|
+
f"line exceeds {MAX_CHUNK_CHARS} characters: {path}:{first_line + i}"
|
|
78
|
+
)
|
|
79
|
+
out.extend(
|
|
80
|
+
windows(part, path, first_line + i, max(1, size // 2), 0, symbol)
|
|
81
|
+
)
|
|
82
|
+
elif text.strip():
|
|
83
|
+
out.append(
|
|
84
|
+
Chunk(
|
|
85
|
+
path, first_line + i, first_line + i + len(part) - 1, text, symbol
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
if i + size >= len(lines):
|
|
89
|
+
break
|
|
90
|
+
return out
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _begin(node: ast.AST) -> int:
|
|
94
|
+
decorators = getattr(node, "decorator_list", [])
|
|
95
|
+
return min([node.lineno, *(d.lineno for d in decorators)])
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _partition(node: ast.AST, start: int, end: int, symbol, depth: int = 0):
|
|
99
|
+
"""Split a long body into its blocks, covering every line of [start, end]."""
|
|
100
|
+
body = getattr(node, "body", None)
|
|
101
|
+
if not isinstance(body, list) or end - start < SPLIT_LINES:
|
|
102
|
+
return None
|
|
103
|
+
stmts = [s for s in body if hasattr(s, "end_lineno")]
|
|
104
|
+
if not stmts:
|
|
105
|
+
return None
|
|
106
|
+
if len(stmts) == 1:
|
|
107
|
+
return (
|
|
108
|
+
_partition(stmts[0], start, end, symbol, depth + 1) if depth < 3 else None
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
out: list[_Range] = []
|
|
112
|
+
cursor = start
|
|
113
|
+
group: list[ast.stmt] = []
|
|
114
|
+
|
|
115
|
+
def flush(last: bool) -> None:
|
|
116
|
+
nonlocal cursor
|
|
117
|
+
if not group:
|
|
118
|
+
return
|
|
119
|
+
stop = end if last else min(end, group[-1].end_lineno)
|
|
120
|
+
if stop >= cursor:
|
|
121
|
+
inner = None
|
|
122
|
+
if len(group) == 1 and depth < 3:
|
|
123
|
+
inner = _partition(group[0], cursor, stop, symbol, depth + 1)
|
|
124
|
+
out.extend(inner or [_Range(cursor, stop, symbol)])
|
|
125
|
+
cursor = stop + 1
|
|
126
|
+
group.clear()
|
|
127
|
+
|
|
128
|
+
for stmt in stmts:
|
|
129
|
+
span = stmt.end_lineno - _begin(stmt) + 1
|
|
130
|
+
if group and (span >= 6 or stmt.end_lineno - cursor + 1 > 20):
|
|
131
|
+
flush(False)
|
|
132
|
+
group.append(stmt)
|
|
133
|
+
if span >= 6 and stmt is not stmts[-1]:
|
|
134
|
+
flush(False)
|
|
135
|
+
flush(True)
|
|
136
|
+
return out if len(out) > 1 else None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _python_ranges(text: str) -> list[_Range]:
|
|
140
|
+
tree = ast.parse(text)
|
|
141
|
+
ranges: list[_Range] = []
|
|
142
|
+
|
|
143
|
+
def emit(node: ast.AST, start: int, symbol: str | None) -> None:
|
|
144
|
+
ranges.extend(
|
|
145
|
+
_partition(node, start, node.end_lineno, symbol)
|
|
146
|
+
or [_Range(start, node.end_lineno, symbol)]
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
for node in tree.body:
|
|
150
|
+
if isinstance(node, ast.ClassDef):
|
|
151
|
+
ranges.append(_Range(_begin(node), node.body[0].lineno - 1, node.name))
|
|
152
|
+
for member in node.body:
|
|
153
|
+
name = getattr(member, "name", "body")
|
|
154
|
+
emit(member, _begin(member), f"{node.name}.{name}")
|
|
155
|
+
else:
|
|
156
|
+
emit(node, _begin(node), getattr(node, "name", None))
|
|
157
|
+
return _merge_short_neighbours(ranges)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _merge_short_neighbours(ranges: list[_Range]) -> list[_Range]:
|
|
161
|
+
"""Fold runs of imports/one-liners into one target (each costs a judgment)."""
|
|
162
|
+
|
|
163
|
+
def mergeable(r: _Range) -> bool:
|
|
164
|
+
return r.end - r.start <= 1 and "." not in (r.symbol or "")
|
|
165
|
+
|
|
166
|
+
merged: list[_Range] = []
|
|
167
|
+
for r in ranges:
|
|
168
|
+
last = merged[-1] if merged else None
|
|
169
|
+
if (
|
|
170
|
+
last
|
|
171
|
+
and mergeable(last)
|
|
172
|
+
and mergeable(r)
|
|
173
|
+
and r.start <= last.end + 1
|
|
174
|
+
and r.end - last.start < 12
|
|
175
|
+
and len(f"{last.symbol} {r.symbol}") < 60
|
|
176
|
+
):
|
|
177
|
+
names = dict.fromkeys(s for s in (last.symbol, r.symbol) if s)
|
|
178
|
+
last.end, last.symbol = r.end, ", ".join(names) or None
|
|
179
|
+
else:
|
|
180
|
+
merged.append(_Range(r.start, r.end, r.symbol))
|
|
181
|
+
return merged
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _chunks_from_ranges(
|
|
185
|
+
lines: list[str], path: str, ranges: list[_Range]
|
|
186
|
+
) -> list[Chunk]:
|
|
187
|
+
out: list[Chunk] = []
|
|
188
|
+
next_line = 1
|
|
189
|
+
for r in ranges:
|
|
190
|
+
start, end = min(r.start, next_line), min(r.end, len(lines))
|
|
191
|
+
if end < start:
|
|
192
|
+
continue
|
|
193
|
+
part = lines[start - 1 : end]
|
|
194
|
+
whole = (
|
|
195
|
+
end - start < WHOLE_DECLARATION_LINES
|
|
196
|
+
and len("\n".join(part)) <= MAX_CHUNK_CHARS
|
|
197
|
+
)
|
|
198
|
+
size, overlap = (len(part), 0) if whole else (WINDOW, OVERLAP)
|
|
199
|
+
out.extend(windows(part, path, start, size, overlap, r.symbol))
|
|
200
|
+
next_line = end + 1
|
|
201
|
+
if next_line <= len(lines):
|
|
202
|
+
out.extend(windows(lines[next_line - 1 :], path, next_line))
|
|
203
|
+
return out
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def source_chunks(text: str, path: str) -> tuple[list[Chunk], str]:
|
|
207
|
+
"""Chunk one file's text. Returns (chunks, parser_name)."""
|
|
208
|
+
lines = text.splitlines()
|
|
209
|
+
if path.endswith(".py"):
|
|
210
|
+
try:
|
|
211
|
+
ranges = _python_ranges(text)
|
|
212
|
+
except (SyntaxError, ValueError, RecursionError):
|
|
213
|
+
ranges = []
|
|
214
|
+
if ranges:
|
|
215
|
+
return _chunks_from_ranges(lines, path, ranges), "python"
|
|
216
|
+
return windows(lines, path), "overlapping-lines"
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def list_files(directory: str, glob: str | None = None) -> list[str]:
|
|
220
|
+
"""Files ripgrep would search: honours .gitignore, skips hidden files."""
|
|
221
|
+
rg = find_ripgrep()
|
|
222
|
+
if rg is None:
|
|
223
|
+
raise RuntimeError("ripgrep (rg) is required for smart_grep.")
|
|
224
|
+
args = [rg, "--files", "-0", *(["-g", glob] if glob else []), "--", directory]
|
|
225
|
+
proc = subprocess.run(args, capture_output=True, timeout=15, check=False)
|
|
226
|
+
if proc.returncode not in (0, 1): # 1 == no files
|
|
227
|
+
raise RuntimeError(
|
|
228
|
+
f"ripgrep discovery failed: {proc.stderr.decode(errors='replace')[:300]}"
|
|
229
|
+
)
|
|
230
|
+
files = sorted({f for f in proc.stdout.decode(errors="replace").split("\0") if f})
|
|
231
|
+
if len(files) > MAX_FILES:
|
|
232
|
+
raise RuntimeError(
|
|
233
|
+
f"Search exceeds {MAX_FILES} files. Narrow the directory or glob."
|
|
234
|
+
)
|
|
235
|
+
return files
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def discover(directory: str, glob: str | None = None) -> Discovery:
|
|
239
|
+
"""Read and chunk every eligible file under ``directory``."""
|
|
240
|
+
found = Discovery()
|
|
241
|
+
files = list_files(directory, glob)
|
|
242
|
+
found.files = len(files)
|
|
243
|
+
total_bytes = 0
|
|
244
|
+
for path in files:
|
|
245
|
+
if os.path.getsize(path) > MAX_FILE_BYTES:
|
|
246
|
+
found.skipped.append((path, "larger than 1 MiB"))
|
|
247
|
+
continue
|
|
248
|
+
with open(path, "rb") as fh:
|
|
249
|
+
raw = fh.read()
|
|
250
|
+
total_bytes += len(raw)
|
|
251
|
+
if total_bytes > MAX_TOTAL_BYTES:
|
|
252
|
+
raise RuntimeError(
|
|
253
|
+
"Search exceeds 32 MiB of source. Narrow the directory or glob."
|
|
254
|
+
)
|
|
255
|
+
if b"\0" in raw:
|
|
256
|
+
found.skipped.append((path, "binary"))
|
|
257
|
+
continue
|
|
258
|
+
try:
|
|
259
|
+
text = raw.decode("utf-8")
|
|
260
|
+
chunks, parser = source_chunks(text, path)
|
|
261
|
+
except UnicodeDecodeError:
|
|
262
|
+
found.skipped.append((path, "not UTF-8"))
|
|
263
|
+
continue
|
|
264
|
+
except LineTooLong as exc:
|
|
265
|
+
found.skipped.append((path, str(exc)))
|
|
266
|
+
continue
|
|
267
|
+
found.parsers[parser] += 1
|
|
268
|
+
found.chunks.extend(chunks)
|
|
269
|
+
return found
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Settings for smart_grep. Set with `/set <key> <value>` or the environment.
|
|
2
|
+
|
|
3
|
+
/set smart_grep on enable (off by default)
|
|
4
|
+
/set jev_api_key <key> credentials (or TYPESAFE_API_KEY)
|
|
5
|
+
/set smart_grep_model ... pin a Jev version, e.g. jev-1.13.0
|
|
6
|
+
/set smart_grep_threshold relevance cut-off, 0-1 (default 0.5)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
from code_puppy.config import get_api_key, get_truthy_bool_value, get_value
|
|
14
|
+
|
|
15
|
+
ENABLED_KEY = "smart_grep"
|
|
16
|
+
# TypeSafe's official name first, then the Jev-branded alias. Config lookup
|
|
17
|
+
# is case-insensitive, so `/set jev_api_key ...` matches JEV_API_KEY.
|
|
18
|
+
API_KEY_NAMES = ("TYPESAFE_API_KEY", "JEV_API_KEY")
|
|
19
|
+
API_KEY_NAME = API_KEY_NAMES[0]
|
|
20
|
+
DEFAULT_MODEL = "jev-latest"
|
|
21
|
+
DEFAULT_THRESHOLD = 0.5
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_typesafe_api_key() -> str:
|
|
25
|
+
"""First key found: environment beats config, official name beats alias."""
|
|
26
|
+
for name in API_KEY_NAMES:
|
|
27
|
+
if key := os.environ.get(name):
|
|
28
|
+
return key
|
|
29
|
+
for name in API_KEY_NAMES:
|
|
30
|
+
if key := get_api_key(name):
|
|
31
|
+
return key
|
|
32
|
+
return ""
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def is_enabled() -> bool:
|
|
36
|
+
"""Opt-in: smart_grep sends selected source to an external service."""
|
|
37
|
+
return get_truthy_bool_value(ENABLED_KEY, False)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def is_available() -> bool:
|
|
41
|
+
"""The single gate for tool exposure, prompting and execution."""
|
|
42
|
+
return is_enabled() and bool(get_typesafe_api_key())
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_jev_model_name() -> str:
|
|
46
|
+
"""Pin a version (e.g. ``jev-1.13.0``) once a threshold is tuned against it."""
|
|
47
|
+
return get_value("smart_grep_model") or DEFAULT_MODEL
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_threshold() -> float:
|
|
51
|
+
try:
|
|
52
|
+
value = float(get_value("smart_grep_threshold") or DEFAULT_THRESHOLD)
|
|
53
|
+
except ValueError:
|
|
54
|
+
return DEFAULT_THRESHOLD
|
|
55
|
+
return value if 0 <= value <= 1 else DEFAULT_THRESHOLD
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Relevance judgments from Jev, TypeSafe's decision model, via Pydantic AI.
|
|
2
|
+
|
|
3
|
+
Relevance is scored as the product of two independent judgments -- the snippet
|
|
4
|
+
acts on the requested *entity*, and it performs the requested *operation* -- so
|
|
5
|
+
mentioning a concept is not enough; the code must do the thing. A bounded
|
|
6
|
+
``float`` field on a decision model is answered with the raw probability of
|
|
7
|
+
yes, so there is no confidence-margin math to undo.
|
|
8
|
+
|
|
9
|
+
Every snippet is judged in its own run (its own Jev state), so neighbouring
|
|
10
|
+
snippets never lend each other evidence.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
from collections.abc import Sequence
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, Field
|
|
19
|
+
from pydantic_ai import Agent
|
|
20
|
+
from pydantic_ai.models import Model
|
|
21
|
+
|
|
22
|
+
from .chunks import Chunk
|
|
23
|
+
|
|
24
|
+
DEFAULT_CONCURRENCY = 8
|
|
25
|
+
REQUEST_TIMEOUT_SECONDS = 30
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Relevance(BaseModel):
|
|
29
|
+
"""Decide whether this source code is what a developer searching the codebase wants to find."""
|
|
30
|
+
|
|
31
|
+
entity: float = Field(
|
|
32
|
+
ge=0,
|
|
33
|
+
le=1,
|
|
34
|
+
description=(
|
|
35
|
+
"Does this code act on the thing the search is about "
|
|
36
|
+
"(the data, object, resource or concept it names)?"
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
operation: float = Field(
|
|
40
|
+
ge=0,
|
|
41
|
+
le=1,
|
|
42
|
+
description=(
|
|
43
|
+
"Does this code itself perform the action or behaviour the search "
|
|
44
|
+
"describes, rather than only mentioning it, importing it, or calling "
|
|
45
|
+
"something with a similar name?"
|
|
46
|
+
),
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def score(self) -> float:
|
|
51
|
+
return self.entity * self.operation
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def build_jev_model(model_name: str, api_key: str) -> Model:
|
|
55
|
+
"""A TypeSafe Jev model. Imported lazily: the SDK is an optional extra."""
|
|
56
|
+
from pydantic_ai.models.typesafe import TypeSafeModel
|
|
57
|
+
from pydantic_ai.providers.typesafe import TypeSafeProvider
|
|
58
|
+
|
|
59
|
+
return TypeSafeModel(model_name, provider=TypeSafeProvider(api_key=api_key))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _state(chunk: Chunk) -> str:
|
|
63
|
+
"""What Jev judges: where the snippet lives, then the snippet itself."""
|
|
64
|
+
where = f"{chunk.path}:{chunk.line}-{chunk.end_line}"
|
|
65
|
+
header = f"{where} ({chunk.symbol})" if chunk.symbol else where
|
|
66
|
+
return f"{header}\n\n{chunk.text}"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def build_agent(model: Model, query: str) -> Agent[None, Relevance]:
|
|
70
|
+
return Agent(
|
|
71
|
+
model,
|
|
72
|
+
output_type=Relevance,
|
|
73
|
+
instructions=(
|
|
74
|
+
"The text is a snippet of source code from a repository. "
|
|
75
|
+
f"A developer is searching the codebase for: {query}"
|
|
76
|
+
),
|
|
77
|
+
model_settings={"timeout": REQUEST_TIMEOUT_SECONDS},
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def judge(
|
|
82
|
+
model: Model,
|
|
83
|
+
query: str,
|
|
84
|
+
chunks: Sequence[Chunk],
|
|
85
|
+
concurrency: int = DEFAULT_CONCURRENCY,
|
|
86
|
+
) -> list[float]:
|
|
87
|
+
"""Score each chunk in [0, 1], order preserved.
|
|
88
|
+
|
|
89
|
+
Any failed judgment fails the whole search (siblings are cancelled):
|
|
90
|
+
a partial scan reported as a complete one is worse than an error.
|
|
91
|
+
"""
|
|
92
|
+
agent = build_agent(model, query)
|
|
93
|
+
gate = asyncio.Semaphore(concurrency)
|
|
94
|
+
|
|
95
|
+
async def one(chunk: Chunk) -> float:
|
|
96
|
+
async with gate:
|
|
97
|
+
result = await agent.run(_state(chunk))
|
|
98
|
+
return result.output.score
|
|
99
|
+
|
|
100
|
+
async with asyncio.TaskGroup() as group:
|
|
101
|
+
tasks = [group.create_task(one(chunk)) for chunk in chunks]
|
|
102
|
+
return [task.result() for task in tasks]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""smart_grep: semantic code search judged by TypeSafe's Jev decision model.
|
|
2
|
+
|
|
3
|
+
Registers a ``smart_grep`` tool alongside the regular ``grep``. It is opt-in:
|
|
4
|
+
agents only see the tool, and the smart_grep-first discovery policy is only
|
|
5
|
+
added to the prompt, once ``/set smart_grep on`` is set AND a Jev/TypeSafe
|
|
6
|
+
key is configured. ``/set`` reloads the agent, so toggling applies at once.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from code_puppy.callbacks import register_callback
|
|
10
|
+
|
|
11
|
+
from .config import is_available
|
|
12
|
+
from .tool import TOOL_NAME, register_smart_grep
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _register_tools():
|
|
16
|
+
return [{"name": TOOL_NAME, "register_func": register_smart_grep}]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _advertise_when_configured(agent_name=None):
|
|
20
|
+
return [TOOL_NAME] if is_available() else []
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _discovery_instructions() -> str | None:
|
|
24
|
+
"""Same live gate as tool advertisement; the key itself is never included."""
|
|
25
|
+
if not is_available():
|
|
26
|
+
return None
|
|
27
|
+
return """## Code discovery: smart_grep first
|
|
28
|
+
When smart_grep is available, use it as your first tool for gathering code
|
|
29
|
+
context about an unfamiliar implementation. Describe the behavior you need to
|
|
30
|
+
find in plain English, scoped to the relevant repository or directory. Do this
|
|
31
|
+
instead of guessing symbol names, running exploratory grep chains, or listing
|
|
32
|
+
and reading many files just to locate the implementation.
|
|
33
|
+
|
|
34
|
+
Use the returned source excerpts and line ranges to decide which files need a
|
|
35
|
+
targeted read. Do not automatically read every match or repeat searches when
|
|
36
|
+
the excerpts already answer the question. Read the relevant existing code before
|
|
37
|
+
editing; semantic search is discovery, not a substitute for understanding it.
|
|
38
|
+
|
|
39
|
+
Use regular grep for exact symbols, regexes, and exhaustive references. Read a
|
|
40
|
+
known file directly when its location is already established. Use list_files
|
|
41
|
+
when you actually need directory contents, not as a ritual before every search.
|
|
42
|
+
|
|
43
|
+
A lexical shortlist is not exhaustive and no matches do not prove absence.
|
|
44
|
+
If results are weak, rephrase or narrow the query, or use exact grep as needed.
|
|
45
|
+
If smart_grep is unavailable or errors, fall back to grep and targeted reads;
|
|
46
|
+
do not block the task or repeatedly retry a missing key or failing provider.
|
|
47
|
+
Respect requests to keep code local: smart_grep sends selected source, paths,
|
|
48
|
+
and the query to TypeSafe, so use local grep/reads for local-only work.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
register_callback("load_prompt", _discovery_instructions)
|
|
53
|
+
register_callback("register_tools", _register_tools)
|
|
54
|
+
register_callback("register_agent_tools", _advertise_when_configured)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Local BM25 shortlist: identifier-aware terms, path/symbol boost, synonyms.
|
|
2
|
+
|
|
3
|
+
Cheap lexical ranking decides which snippets are worth a Jev judgment. It is
|
|
4
|
+
a shortlist, not a verdict: code with unrelated wording can be missed, which
|
|
5
|
+
is why coverage is reported back to the caller.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import math
|
|
11
|
+
import re
|
|
12
|
+
from collections import Counter
|
|
13
|
+
from collections.abc import Sequence
|
|
14
|
+
|
|
15
|
+
from .chunks import Chunk
|
|
16
|
+
|
|
17
|
+
_STOP = frozenset(
|
|
18
|
+
"a an the is are was were to of in on for from with where how does do this "
|
|
19
|
+
"that it and or code function files file find which".split()
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
_SYNONYM_GROUPS = (
|
|
23
|
+
"auth authentication authenticate login signin session",
|
|
24
|
+
"retry retries backoff attempt",
|
|
25
|
+
"cache cached caching memo memoize",
|
|
26
|
+
"delete remove cleanup unlink",
|
|
27
|
+
"permission permissions authorization authorize access allowed",
|
|
28
|
+
"expire expired expires expiration expiry timeout ttl",
|
|
29
|
+
"save persist persistence storage store write",
|
|
30
|
+
"error errors failure failed exception throw catch",
|
|
31
|
+
"payment payments billing subscription invoice charge",
|
|
32
|
+
"cancel abort cancellation",
|
|
33
|
+
"parallel concurrent concurrency simultaneous",
|
|
34
|
+
"duplicate duplicates deduplicate dedup unique",
|
|
35
|
+
)
|
|
36
|
+
_VOCABULARY = {
|
|
37
|
+
term: group.split() for group in _SYNONYM_GROUPS for term in group.split()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
_CAMEL = re.compile(r"([a-z\d])([A-Z])")
|
|
41
|
+
_WORD = re.compile(r"[^\W_]+")
|
|
42
|
+
_SYNONYM_WEIGHT = 0.3
|
|
43
|
+
_META_BOOST = 3
|
|
44
|
+
_K1, _B = 1.2, 0.75
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def terms(text: str) -> list[str]:
|
|
48
|
+
"""Lower-cased identifier-aware tokens: ``refreshToken`` -> refresh, token."""
|
|
49
|
+
words = _WORD.findall(_CAMEL.sub(r"\1 \2", text).lower())
|
|
50
|
+
return [w for w in words if len(w) > 1 and w not in _STOP]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _query_weights(query: str) -> dict[str, float]:
|
|
54
|
+
weights = dict.fromkeys(terms(query), 1.0)
|
|
55
|
+
for term in list(weights):
|
|
56
|
+
for synonym in _VOCABULARY.get(term, ()):
|
|
57
|
+
weights.setdefault(synonym, _SYNONYM_WEIGHT)
|
|
58
|
+
return weights
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def rank(query: str, chunks: Sequence[Chunk]) -> list[Chunk]:
|
|
62
|
+
"""Chunks ordered by BM25 relevance to ``query`` (stable on ties)."""
|
|
63
|
+
weights = _query_weights(query)
|
|
64
|
+
docs: list[tuple[Counter, int]] = []
|
|
65
|
+
for chunk in chunks:
|
|
66
|
+
body, meta = terms(chunk.text), terms(f"{chunk.path} {chunk.symbol or ''}")
|
|
67
|
+
freq = Counter(body)
|
|
68
|
+
for word in meta:
|
|
69
|
+
freq[word] += _META_BOOST
|
|
70
|
+
docs.append((freq, len(body) + len(meta)))
|
|
71
|
+
|
|
72
|
+
n = len(docs)
|
|
73
|
+
average = (sum(length for _, length in docs) / n if n else 0) or 1
|
|
74
|
+
df = {t: sum(1 for freq, _ in docs if t in freq) for t in weights}
|
|
75
|
+
|
|
76
|
+
def score(doc: tuple[Counter, int]) -> float:
|
|
77
|
+
freq, length = doc
|
|
78
|
+
total = 0.0
|
|
79
|
+
for word, weight in weights.items():
|
|
80
|
+
tf = freq.get(word, 0)
|
|
81
|
+
if not tf:
|
|
82
|
+
continue
|
|
83
|
+
idf = math.log(1 + (n - df[word] + 0.5) / (df[word] + 0.5))
|
|
84
|
+
norm = _K1 * (1 - _B + _B * length / average)
|
|
85
|
+
total += weight * idf * tf * (_K1 + 1) / (tf + norm)
|
|
86
|
+
return total
|
|
87
|
+
|
|
88
|
+
scored = [(score(doc), chunk) for doc, chunk in zip(docs, chunks)]
|
|
89
|
+
scored.sort(key=lambda sc: (-sc[0], sc[1].path, sc[1].line))
|
|
90
|
+
return [chunk for _, chunk in scored]
|