code-puppy-core-plugins 0.0.2__py3-none-any.whl
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/__init__.py +5 -0
- code_puppy_core_plugins/acp/README.md +266 -0
- code_puppy_core_plugins/acp/__init__.py +8 -0
- code_puppy_core_plugins/acp/agent.py +494 -0
- code_puppy_core_plugins/acp/bridge.py +309 -0
- code_puppy_core_plugins/acp/capabilities.py +73 -0
- code_puppy_core_plugins/acp/commands.py +116 -0
- code_puppy_core_plugins/acp/content.py +115 -0
- code_puppy_core_plugins/acp/io_delegation.py +231 -0
- code_puppy_core_plugins/acp/mcp_config.py +66 -0
- code_puppy_core_plugins/acp/permissions.py +159 -0
- code_puppy_core_plugins/acp/persistence.py +197 -0
- code_puppy_core_plugins/acp/register_callbacks.py +110 -0
- code_puppy_core_plugins/acp/replay.py +114 -0
- code_puppy_core_plugins/acp/session.py +329 -0
- code_puppy_core_plugins/acp/session_config.py +179 -0
- code_puppy_core_plugins/acp/state.py +135 -0
- code_puppy_core_plugins/agent_skills/__init__.py +22 -0
- code_puppy_core_plugins/agent_skills/config.py +208 -0
- code_puppy_core_plugins/agent_skills/discovery.py +337 -0
- code_puppy_core_plugins/agent_skills/downloader.py +392 -0
- code_puppy_core_plugins/agent_skills/enabled_skills.py +82 -0
- code_puppy_core_plugins/agent_skills/installer.py +22 -0
- code_puppy_core_plugins/agent_skills/metadata.py +219 -0
- code_puppy_core_plugins/agent_skills/prompt_builder.py +49 -0
- code_puppy_core_plugins/agent_skills/provider.py +52 -0
- code_puppy_core_plugins/agent_skills/register_callbacks.py +309 -0
- code_puppy_core_plugins/agent_skills/remote_catalog.py +322 -0
- code_puppy_core_plugins/agent_skills/skill_catalog.py +257 -0
- code_puppy_core_plugins/agent_skills/skill_commands.py +102 -0
- code_puppy_core_plugins/agent_skills/skills_install_menu.py +698 -0
- code_puppy_core_plugins/agent_skills/skills_menu.py +794 -0
- code_puppy_core_plugins/aws_bedrock/__init__.py +14 -0
- code_puppy_core_plugins/aws_bedrock/config.py +101 -0
- code_puppy_core_plugins/aws_bedrock/register_callbacks.py +243 -0
- code_puppy_core_plugins/aws_bedrock/utils.py +186 -0
- code_puppy_core_plugins/azure_foundry/README.md +238 -0
- code_puppy_core_plugins/azure_foundry/__init__.py +15 -0
- code_puppy_core_plugins/azure_foundry/config.py +126 -0
- code_puppy_core_plugins/azure_foundry/discovery.py +189 -0
- code_puppy_core_plugins/azure_foundry/register_callbacks.py +506 -0
- code_puppy_core_plugins/azure_foundry/token.py +182 -0
- code_puppy_core_plugins/azure_foundry/utils.py +375 -0
- code_puppy_core_plugins/btw/__init__.py +1 -0
- code_puppy_core_plugins/btw/inline_view.py +135 -0
- code_puppy_core_plugins/btw/register_callbacks.py +106 -0
- code_puppy_core_plugins/btw/side_query.py +91 -0
- code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +83 -0
- code_puppy_core_plugins/chatgpt_oauth/__init__.py +8 -0
- code_puppy_core_plugins/chatgpt_oauth/config.py +52 -0
- code_puppy_core_plugins/chatgpt_oauth/image_generation.py +253 -0
- code_puppy_core_plugins/chatgpt_oauth/image_tool.py +70 -0
- code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +461 -0
- code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +288 -0
- code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +663 -0
- code_puppy_core_plugins/chatgpt_oauth/usage.py +113 -0
- code_puppy_core_plugins/chatgpt_oauth/utils.py +534 -0
- code_puppy_core_plugins/claude_code_hooks/__init__.py +1 -0
- code_puppy_core_plugins/claude_code_hooks/config.py +137 -0
- code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +383 -0
- code_puppy_core_plugins/claude_code_oauth/README.md +167 -0
- code_puppy_core_plugins/claude_code_oauth/SETUP.md +93 -0
- code_puppy_core_plugins/claude_code_oauth/__init__.py +25 -0
- code_puppy_core_plugins/claude_code_oauth/config.py +59 -0
- code_puppy_core_plugins/claude_code_oauth/fast_mode.py +122 -0
- code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +64 -0
- code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +719 -0
- code_puppy_core_plugins/claude_code_oauth/test_plugin.py +285 -0
- code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +240 -0
- code_puppy_core_plugins/claude_code_oauth/utils.py +663 -0
- code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +155 -0
- code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +104 -0
- code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +147 -0
- code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +39 -0
- code_puppy_core_plugins/code_puppy_agent/SKILL.md +180 -0
- code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +136 -0
- code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +160 -0
- code_puppy_core_plugins/code_puppy_agent/__init__.py +5 -0
- code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +46 -0
- code_puppy_core_plugins/computer_use/NativeCapture.swift +123 -0
- code_puppy_core_plugins/computer_use/README.md +109 -0
- code_puppy_core_plugins/computer_use/__init__.py +1 -0
- code_puppy_core_plugins/computer_use/accessibility.py +163 -0
- code_puppy_core_plugins/computer_use/activation.py +75 -0
- code_puppy_core_plugins/computer_use/backend.py +584 -0
- code_puppy_core_plugins/computer_use/backend_types.py +5 -0
- code_puppy_core_plugins/computer_use/capture.py +110 -0
- code_puppy_core_plugins/computer_use/commands.py +62 -0
- code_puppy_core_plugins/computer_use/geometry.py +81 -0
- code_puppy_core_plugins/computer_use/inline_image.py +56 -0
- code_puppy_core_plugins/computer_use/keycodes.py +47 -0
- code_puppy_core_plugins/computer_use/policy.py +144 -0
- code_puppy_core_plugins/computer_use/register_callbacks.py +96 -0
- code_puppy_core_plugins/computer_use/safety.py +18 -0
- code_puppy_core_plugins/computer_use/settle.py +64 -0
- code_puppy_core_plugins/computer_use/state.py +86 -0
- code_puppy_core_plugins/computer_use/tools.py +469 -0
- code_puppy_core_plugins/context_indicator/__init__.py +14 -0
- code_puppy_core_plugins/context_indicator/register_callbacks.py +249 -0
- code_puppy_core_plugins/context_indicator/usage.py +40 -0
- code_puppy_core_plugins/copilot_auth/__init__.py +11 -0
- code_puppy_core_plugins/copilot_auth/config.py +93 -0
- code_puppy_core_plugins/copilot_auth/reasoning_client.py +409 -0
- code_puppy_core_plugins/copilot_auth/register_callbacks.py +460 -0
- code_puppy_core_plugins/copilot_auth/utils.py +587 -0
- code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- code_puppy_core_plugins/customizable_commands/register_callbacks.py +464 -0
- code_puppy_core_plugins/dbos_durable_exec/__init__.py +1 -0
- code_puppy_core_plugins/dbos_durable_exec/cancel.py +15 -0
- code_puppy_core_plugins/dbos_durable_exec/commands.py +31 -0
- code_puppy_core_plugins/dbos_durable_exec/config.py +31 -0
- code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +83 -0
- code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +45 -0
- code_puppy_core_plugins/dbos_durable_exec/runtime.py +65 -0
- code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +155 -0
- code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +16 -0
- code_puppy_core_plugins/dbos_durable_exec/wrapper.py +58 -0
- code_puppy_core_plugins/destructive_command_guard/AGENTS.md +79 -0
- code_puppy_core_plugins/destructive_command_guard/__init__.py +14 -0
- code_puppy_core_plugins/destructive_command_guard/detector.py +374 -0
- code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +165 -0
- code_puppy_core_plugins/emoji_filter/__init__.py +12 -0
- code_puppy_core_plugins/emoji_filter/config.py +26 -0
- code_puppy_core_plugins/emoji_filter/register_callbacks.py +238 -0
- code_puppy_core_plugins/emoji_filter/stripper.py +45 -0
- code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +116 -0
- code_puppy_core_plugins/example_custom_command/README.md +328 -0
- code_puppy_core_plugins/example_custom_command/register_callbacks.py +66 -0
- code_puppy_core_plugins/file_permission_handler/__init__.py +4 -0
- code_puppy_core_plugins/file_permission_handler/register_callbacks.py +575 -0
- code_puppy_core_plugins/flux_bootstrap/__init__.py +5 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +173 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +86 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +167 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +392 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +51 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +129 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +211 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +181 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +71 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +16 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +103 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +108 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +195 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +221 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +151 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +208 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +180 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +304 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +120 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +179 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +46 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +155 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +154 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +248 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +345 -0
- code_puppy_core_plugins/flux_bootstrap/installer.py +256 -0
- code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +71 -0
- code_puppy_core_plugins/force_push_guard/__init__.py +5 -0
- code_puppy_core_plugins/force_push_guard/detector.py +96 -0
- code_puppy_core_plugins/force_push_guard/register_callbacks.py +161 -0
- code_puppy_core_plugins/fork/__init__.py +7 -0
- code_puppy_core_plugins/fork/register_callbacks.py +445 -0
- code_puppy_core_plugins/frontend_emitter/__init__.py +25 -0
- code_puppy_core_plugins/frontend_emitter/emitter.py +249 -0
- code_puppy_core_plugins/frontend_emitter/register_callbacks.py +412 -0
- code_puppy_core_plugins/frontend_emitter/session_context.py +50 -0
- code_puppy_core_plugins/grok_oauth/__init__.py +6 -0
- code_puppy_core_plugins/grok_oauth/config.py +49 -0
- code_puppy_core_plugins/grok_oauth/oauth_flow.py +213 -0
- code_puppy_core_plugins/grok_oauth/register_callbacks.py +132 -0
- code_puppy_core_plugins/grok_oauth/utils.py +195 -0
- code_puppy_core_plugins/herdr/README.md +168 -0
- code_puppy_core_plugins/herdr/__init__.py +9 -0
- code_puppy_core_plugins/herdr/client.py +339 -0
- code_puppy_core_plugins/herdr/register_callbacks.py +140 -0
- code_puppy_core_plugins/herdr/reporter.py +212 -0
- code_puppy_core_plugins/herdr/smoke.py +143 -0
- code_puppy_core_plugins/herdr/sources.py +133 -0
- code_puppy_core_plugins/hook_creator/__init__.py +1 -0
- code_puppy_core_plugins/hook_creator/register_callbacks.py +33 -0
- code_puppy_core_plugins/hook_manager/__init__.py +1 -0
- code_puppy_core_plugins/hook_manager/config.py +290 -0
- code_puppy_core_plugins/hook_manager/hooks_menu.py +571 -0
- code_puppy_core_plugins/hook_manager/register_callbacks.py +227 -0
- code_puppy_core_plugins/meta_oauth/__init__.py +1 -0
- code_puppy_core_plugins/meta_oauth/config.py +55 -0
- code_puppy_core_plugins/meta_oauth/oauth_flow.py +109 -0
- code_puppy_core_plugins/meta_oauth/register_callbacks.py +154 -0
- code_puppy_core_plugins/meta_oauth/utils.py +252 -0
- code_puppy_core_plugins/namespace_skill_search/README.md +118 -0
- code_puppy_core_plugins/namespace_skill_search/__init__.py +15 -0
- code_puppy_core_plugins/namespace_skill_search/namespaces.py +125 -0
- code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +99 -0
- code_puppy_core_plugins/namespace_skill_search/search_tool.py +158 -0
- code_puppy_core_plugins/no_tools/__init__.py +0 -0
- code_puppy_core_plugins/no_tools/register_callbacks.py +42 -0
- code_puppy_core_plugins/oauth_pasteback.py +110 -0
- code_puppy_core_plugins/oauth_puppy_html.py +194 -0
- code_puppy_core_plugins/obsidian_agent/README.md +52 -0
- code_puppy_core_plugins/obsidian_agent/__init__.py +8 -0
- code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +147 -0
- code_puppy_core_plugins/obsidian_agent/register_callbacks.py +13 -0
- code_puppy_core_plugins/ollama/__init__.py +1 -0
- code_puppy_core_plugins/ollama/register_callbacks.py +127 -0
- code_puppy_core_plugins/ollama_setup/__init__.py +5 -0
- code_puppy_core_plugins/ollama_setup/completer.py +38 -0
- code_puppy_core_plugins/ollama_setup/register_callbacks.py +419 -0
- code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- code_puppy_core_plugins/plugin_list/plugin_contributions.py +348 -0
- code_puppy_core_plugins/plugin_list/plugin_meta.py +67 -0
- code_puppy_core_plugins/plugin_list/plugin_text_utils.py +173 -0
- code_puppy_core_plugins/plugin_list/plugins_menu.py +455 -0
- code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +194 -0
- code_puppy_core_plugins/plugin_list/plugins_menu_render.py +431 -0
- code_puppy_core_plugins/plugin_list/project_trust_flow.py +162 -0
- code_puppy_core_plugins/plugin_list/register_callbacks.py +281 -0
- code_puppy_core_plugins/pop_command/__init__.py +1 -0
- code_puppy_core_plugins/pop_command/register_callbacks.py +191 -0
- code_puppy_core_plugins/prompt_newline/__init__.py +13 -0
- code_puppy_core_plugins/prompt_newline/config.py +21 -0
- code_puppy_core_plugins/prompt_newline/register_callbacks.py +163 -0
- code_puppy_core_plugins/prune/__init__.py +1 -0
- code_puppy_core_plugins/prune/prune_menu.py +308 -0
- code_puppy_core_plugins/prune/prune_model.py +517 -0
- code_puppy_core_plugins/prune/prune_render.py +354 -0
- code_puppy_core_plugins/prune/register_callbacks.py +388 -0
- code_puppy_core_plugins/puppy_kennel/README.md +203 -0
- code_puppy_core_plugins/puppy_kennel/__init__.py +6 -0
- code_puppy_core_plugins/puppy_kennel/commands.py +206 -0
- code_puppy_core_plugins/puppy_kennel/config.py +36 -0
- code_puppy_core_plugins/puppy_kennel/kennel.py +368 -0
- code_puppy_core_plugins/puppy_kennel/packer.py +152 -0
- code_puppy_core_plugins/puppy_kennel/recorder.py +83 -0
- code_puppy_core_plugins/puppy_kennel/register_callbacks.py +109 -0
- code_puppy_core_plugins/puppy_kennel/retriever.py +28 -0
- code_puppy_core_plugins/puppy_kennel/schema.py +78 -0
- code_puppy_core_plugins/puppy_kennel/state.py +68 -0
- code_puppy_core_plugins/puppy_kennel/tools.py +449 -0
- code_puppy_core_plugins/puppy_kennel/wings.py +110 -0
- code_puppy_core_plugins/puppy_spinner/README.md +93 -0
- code_puppy_core_plugins/puppy_spinner/__init__.py +11 -0
- code_puppy_core_plugins/puppy_spinner/builtin_frames.py +172 -0
- code_puppy_core_plugins/puppy_spinner/commands.py +116 -0
- code_puppy_core_plugins/puppy_spinner/picker.py +379 -0
- code_puppy_core_plugins/puppy_spinner/register_callbacks.py +193 -0
- code_puppy_core_plugins/puppy_spinner/spinners.py +444 -0
- code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- code_puppy_core_plugins/quick_resume/register_callbacks.py +77 -0
- code_puppy_core_plugins/review_pr/__init__.py +1 -0
- code_puppy_core_plugins/review_pr/register_callbacks.py +162 -0
- code_puppy_core_plugins/shell_safety/__init__.py +6 -0
- code_puppy_core_plugins/shell_safety/agent_shell_safety.py +69 -0
- code_puppy_core_plugins/shell_safety/command_cache.py +156 -0
- code_puppy_core_plugins/shell_safety/register_callbacks.py +203 -0
- code_puppy_core_plugins/stack_dump/__init__.py +1 -0
- code_puppy_core_plugins/stack_dump/register_callbacks.py +79 -0
- code_puppy_core_plugins/statusline/__init__.py +14 -0
- code_puppy_core_plugins/statusline/config.py +68 -0
- code_puppy_core_plugins/statusline/payload.py +138 -0
- code_puppy_core_plugins/statusline/prompt_patch.py +76 -0
- code_puppy_core_plugins/statusline/register_callbacks.py +45 -0
- code_puppy_core_plugins/statusline/runner.py +122 -0
- code_puppy_core_plugins/statusline/statusline_command.py +197 -0
- code_puppy_core_plugins/steer_queue/__init__.py +10 -0
- code_puppy_core_plugins/steer_queue/queue_menu.py +444 -0
- code_puppy_core_plugins/steer_queue/register_callbacks.py +138 -0
- code_puppy_core_plugins/subagent_panel/README.md +102 -0
- code_puppy_core_plugins/subagent_panel/__init__.py +24 -0
- code_puppy_core_plugins/subagent_panel/coalesce_patch.py +242 -0
- code_puppy_core_plugins/subagent_panel/panel_render.py +145 -0
- code_puppy_core_plugins/subagent_panel/register_callbacks.py +535 -0
- code_puppy_core_plugins/subagent_panel/resume_repaint.py +112 -0
- code_puppy_core_plugins/subagent_panel/state.py +231 -0
- code_puppy_core_plugins/switch_agent_resume/__init__.py +5 -0
- code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +314 -0
- code_puppy_core_plugins/theme/README.md +86 -0
- code_puppy_core_plugins/theme/__init__.py +14 -0
- code_puppy_core_plugins/theme/bundled_palettes.py +346 -0
- code_puppy_core_plugins/theme/content_styles.py +146 -0
- code_puppy_core_plugins/theme/osc_palette.py +178 -0
- code_puppy_core_plugins/theme/picker.py +358 -0
- code_puppy_core_plugins/theme/prompt_toolkit_theme.py +113 -0
- code_puppy_core_plugins/theme/register_callbacks.py +348 -0
- code_puppy_core_plugins/theme/rich_themes.py +202 -0
- code_puppy_core_plugins/theme/themes.py +720 -0
- code_puppy_core_plugins/timestamp_heartbeat/__init__.py +1 -0
- code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +114 -0
- code_puppy_core_plugins/token_ratio_learner/__init__.py +5 -0
- code_puppy_core_plugins/token_ratio_learner/ratios.py +208 -0
- code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +213 -0
- code_puppy_core_plugins/universal_constructor/__init__.py +13 -0
- code_puppy_core_plugins/universal_constructor/models.py +138 -0
- code_puppy_core_plugins/universal_constructor/provider.py +62 -0
- code_puppy_core_plugins/universal_constructor/register_callbacks.py +75 -0
- code_puppy_core_plugins/universal_constructor/registry.py +302 -0
- code_puppy_core_plugins/universal_constructor/sandbox.py +584 -0
- code_puppy_core_plugins/wide_completion_menu/__init__.py +6 -0
- code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +165 -0
- code_puppy_core_plugins/wiggum/__init__.py +1 -0
- code_puppy_core_plugins/wiggum/goal_runs.py +91 -0
- code_puppy_core_plugins/wiggum/judge.py +299 -0
- code_puppy_core_plugins/wiggum/judge_config.py +249 -0
- code_puppy_core_plugins/wiggum/judges_menu.py +814 -0
- code_puppy_core_plugins/wiggum/register_callbacks.py +569 -0
- code_puppy_core_plugins/wiggum/state.py +89 -0
- code_puppy_core_plugins/yolo_cli/__init__.py +1 -0
- code_puppy_core_plugins/yolo_cli/register_callbacks.py +41 -0
- code_puppy_core_plugins-0.0.2.dist-info/METADATA +64 -0
- code_puppy_core_plugins-0.0.2.dist-info/RECORD +313 -0
- code_puppy_core_plugins-0.0.2.dist-info/WHEEL +4 -0
- code_puppy_core_plugins-0.0.2.dist-info/entry_points.txt +55 -0
- code_puppy_core_plugins-0.0.2.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"""Persisted configuration for goal-mode LLM judges.
|
|
2
|
+
|
|
3
|
+
Each judge is a (name, model, prompt, enabled) tuple. Judges live in a
|
|
4
|
+
JSON file at ``$XDG_DATA_HOME/code_puppy/judges.json`` so users can
|
|
5
|
+
configure multiple verifiers — for example, one judge that checks tests
|
|
6
|
+
pass, another that checks docs are updated, etc. The /goal loop fans
|
|
7
|
+
these out in parallel and only declares success when *every* enabled
|
|
8
|
+
judge reports no remediation notes.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
import os
|
|
16
|
+
import re
|
|
17
|
+
from dataclasses import asdict, dataclass, field
|
|
18
|
+
|
|
19
|
+
from code_puppy.config import DATA_DIR
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
JUDGES_FILE = os.path.join(DATA_DIR, "judges.json")
|
|
24
|
+
|
|
25
|
+
_NAME_RE = re.compile(r"^[a-zA-Z0-9_\-]{1,64}$")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
DEFAULT_JUDGE_PROMPT = """\
|
|
29
|
+
You are Code Puppy's goal-completion judge.
|
|
30
|
+
|
|
31
|
+
Decide whether the user's goal is verifiably complete based on the
|
|
32
|
+
implementor's latest response and (optionally) its message history.
|
|
33
|
+
|
|
34
|
+
Rules:
|
|
35
|
+
- You are not the implementation agent.
|
|
36
|
+
- Never modify files. You may use read-only tools if inspection helps.
|
|
37
|
+
- Never ask the user questions.
|
|
38
|
+
- Return the structured output exactly as requested by the runtime.
|
|
39
|
+
- Be strict. If completion is uncertain, mark incomplete and provide
|
|
40
|
+
concrete remediation notes the implementor can act on next turn.
|
|
41
|
+
- For trivial conversational goals, judge based on whether the latest
|
|
42
|
+
response satisfies the request.
|
|
43
|
+
- For coding goals, prefer concrete verification: passing tests,
|
|
44
|
+
successful commands, file inspection.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass
|
|
49
|
+
class JudgeConfig:
|
|
50
|
+
"""One configured judge."""
|
|
51
|
+
|
|
52
|
+
name: str
|
|
53
|
+
model: str
|
|
54
|
+
prompt: str = DEFAULT_JUDGE_PROMPT
|
|
55
|
+
enabled: bool = True
|
|
56
|
+
|
|
57
|
+
def to_dict(self) -> dict:
|
|
58
|
+
return asdict(self)
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_dict(cls, data: dict) -> "JudgeConfig":
|
|
62
|
+
return cls(
|
|
63
|
+
name=str(data.get("name", "")),
|
|
64
|
+
model=str(data.get("model", "")),
|
|
65
|
+
prompt=str(data.get("prompt") or DEFAULT_JUDGE_PROMPT),
|
|
66
|
+
enabled=bool(data.get("enabled", True)),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class JudgeRegistry:
|
|
72
|
+
"""In-memory snapshot of configured judges."""
|
|
73
|
+
|
|
74
|
+
judges: list[JudgeConfig] = field(default_factory=list)
|
|
75
|
+
|
|
76
|
+
def names(self) -> list[str]:
|
|
77
|
+
return [j.name for j in self.judges]
|
|
78
|
+
|
|
79
|
+
def enabled(self) -> list[JudgeConfig]:
|
|
80
|
+
return [j for j in self.judges if j.enabled]
|
|
81
|
+
|
|
82
|
+
def find(self, name: str) -> JudgeConfig | None:
|
|
83
|
+
for j in self.judges:
|
|
84
|
+
if j.name == name:
|
|
85
|
+
return j
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def validate_name(name: str) -> str | None:
|
|
90
|
+
"""Return an error string if the name is invalid, else None."""
|
|
91
|
+
if not name:
|
|
92
|
+
return "Name must not be empty."
|
|
93
|
+
if not _NAME_RE.match(name):
|
|
94
|
+
return (
|
|
95
|
+
"Name must be 1–64 chars, letters/digits/underscore/hyphen only "
|
|
96
|
+
"(no spaces)."
|
|
97
|
+
)
|
|
98
|
+
return None
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def load_judges() -> JudgeRegistry:
|
|
102
|
+
"""Load judges from disk. Returns an empty registry if the file is missing."""
|
|
103
|
+
if not os.path.exists(JUDGES_FILE):
|
|
104
|
+
return JudgeRegistry()
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
with open(JUDGES_FILE, "r", encoding="utf-8") as f:
|
|
108
|
+
data = json.load(f)
|
|
109
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
110
|
+
logger.warning("Failed to load judges from %s: %s", JUDGES_FILE, exc)
|
|
111
|
+
return JudgeRegistry()
|
|
112
|
+
|
|
113
|
+
raw_judges = data.get("judges") if isinstance(data, dict) else None
|
|
114
|
+
if not isinstance(raw_judges, list):
|
|
115
|
+
return JudgeRegistry()
|
|
116
|
+
|
|
117
|
+
judges: list[JudgeConfig] = []
|
|
118
|
+
seen_names: set[str] = set()
|
|
119
|
+
for item in raw_judges:
|
|
120
|
+
if not isinstance(item, dict):
|
|
121
|
+
continue
|
|
122
|
+
try:
|
|
123
|
+
judge = JudgeConfig.from_dict(item)
|
|
124
|
+
except Exception as exc:
|
|
125
|
+
logger.warning("Skipping invalid judge entry: %s", exc)
|
|
126
|
+
continue
|
|
127
|
+
if validate_name(judge.name) is not None:
|
|
128
|
+
logger.warning("Skipping judge with invalid name: %r", judge.name)
|
|
129
|
+
continue
|
|
130
|
+
if judge.name in seen_names:
|
|
131
|
+
logger.warning("Skipping duplicate judge name: %r", judge.name)
|
|
132
|
+
continue
|
|
133
|
+
if not judge.model:
|
|
134
|
+
logger.warning("Skipping judge %r with no model", judge.name)
|
|
135
|
+
continue
|
|
136
|
+
seen_names.add(judge.name)
|
|
137
|
+
judges.append(judge)
|
|
138
|
+
|
|
139
|
+
return JudgeRegistry(judges=judges)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def save_judges(registry: JudgeRegistry) -> None:
|
|
143
|
+
"""Persist the registry to disk atomically."""
|
|
144
|
+
os.makedirs(os.path.dirname(JUDGES_FILE), exist_ok=True)
|
|
145
|
+
payload = {"judges": [j.to_dict() for j in registry.judges]}
|
|
146
|
+
tmp_path = f"{JUDGES_FILE}.tmp"
|
|
147
|
+
with open(tmp_path, "w", encoding="utf-8") as f:
|
|
148
|
+
json.dump(payload, f, indent=2, ensure_ascii=False)
|
|
149
|
+
os.replace(tmp_path, JUDGES_FILE)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def add_judge(judge: JudgeConfig) -> None:
|
|
153
|
+
"""Add a judge. Raises ValueError on name conflict or validation error."""
|
|
154
|
+
err = validate_name(judge.name)
|
|
155
|
+
if err:
|
|
156
|
+
raise ValueError(err)
|
|
157
|
+
if not judge.model:
|
|
158
|
+
raise ValueError("Model must not be empty.")
|
|
159
|
+
|
|
160
|
+
registry = load_judges()
|
|
161
|
+
if registry.find(judge.name) is not None:
|
|
162
|
+
raise ValueError(f"A judge named {judge.name!r} already exists.")
|
|
163
|
+
registry.judges.append(judge)
|
|
164
|
+
save_judges(registry)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def update_judge(
|
|
168
|
+
name: str,
|
|
169
|
+
/,
|
|
170
|
+
*,
|
|
171
|
+
new_name: str | None = None,
|
|
172
|
+
model: str | None = None,
|
|
173
|
+
prompt: str | None = None,
|
|
174
|
+
enabled: bool | None = None,
|
|
175
|
+
) -> None:
|
|
176
|
+
"""Update fields of an existing judge.
|
|
177
|
+
|
|
178
|
+
``name`` is positional-only so it doesn't collide with the ``new_name``
|
|
179
|
+
kwarg used to rename a judge. Pass ``None`` for any field to leave it
|
|
180
|
+
unchanged.
|
|
181
|
+
"""
|
|
182
|
+
registry = load_judges()
|
|
183
|
+
existing = registry.find(name)
|
|
184
|
+
if existing is None:
|
|
185
|
+
raise ValueError(f"No judge named {name!r}.")
|
|
186
|
+
|
|
187
|
+
if new_name is not None and new_name != existing.name:
|
|
188
|
+
err = validate_name(new_name)
|
|
189
|
+
if err:
|
|
190
|
+
raise ValueError(err)
|
|
191
|
+
if registry.find(new_name) is not None:
|
|
192
|
+
raise ValueError(f"A judge named {new_name!r} already exists.")
|
|
193
|
+
existing.name = new_name
|
|
194
|
+
|
|
195
|
+
if model is not None:
|
|
196
|
+
if not model:
|
|
197
|
+
raise ValueError("Model must not be empty.")
|
|
198
|
+
existing.model = model
|
|
199
|
+
|
|
200
|
+
if prompt is not None:
|
|
201
|
+
existing.prompt = prompt or DEFAULT_JUDGE_PROMPT
|
|
202
|
+
|
|
203
|
+
if enabled is not None:
|
|
204
|
+
existing.enabled = bool(enabled)
|
|
205
|
+
|
|
206
|
+
save_judges(registry)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def delete_judge(name: str) -> bool:
|
|
210
|
+
"""Remove a judge. Returns True if it existed."""
|
|
211
|
+
registry = load_judges()
|
|
212
|
+
before = len(registry.judges)
|
|
213
|
+
registry.judges = [j for j in registry.judges if j.name != name]
|
|
214
|
+
if len(registry.judges) == before:
|
|
215
|
+
return False
|
|
216
|
+
save_judges(registry)
|
|
217
|
+
return True
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def toggle_judge(name: str) -> bool | None:
|
|
221
|
+
"""Flip the enabled flag for a judge. Returns the new state, or None if missing."""
|
|
222
|
+
registry = load_judges()
|
|
223
|
+
judge = registry.find(name)
|
|
224
|
+
if judge is None:
|
|
225
|
+
return None
|
|
226
|
+
judge.enabled = not judge.enabled
|
|
227
|
+
save_judges(registry)
|
|
228
|
+
return judge.enabled
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def get_enabled_judges_or_default(fallback_model: str) -> list[JudgeConfig]:
|
|
232
|
+
"""Return the list of enabled judges, or a single default judge.
|
|
233
|
+
|
|
234
|
+
If the user has configured judges via /judges, those are used. Otherwise
|
|
235
|
+
we synthesize a single default judge using ``fallback_model`` and the
|
|
236
|
+
standard goal-judge prompt so /goal works out-of-the-box.
|
|
237
|
+
"""
|
|
238
|
+
registry = load_judges()
|
|
239
|
+
enabled = registry.enabled()
|
|
240
|
+
if enabled:
|
|
241
|
+
return enabled
|
|
242
|
+
return [
|
|
243
|
+
JudgeConfig(
|
|
244
|
+
name="default",
|
|
245
|
+
model=fallback_model,
|
|
246
|
+
prompt=DEFAULT_JUDGE_PROMPT,
|
|
247
|
+
enabled=True,
|
|
248
|
+
)
|
|
249
|
+
]
|